1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -Wunused-variable -analyze -analyzer-checker=core,deadcode.DeadStores -fblocks -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -Wunused-variable -analyze -analyzer-checker=core,deadcode.DeadStores -analyzer-store=region -analyzer-constraints=range -fblocks -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s
38aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek
449a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f1() {
5ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  int k, y; // expected-warning{{unused variable 'k'}} expected-warning{{unused variable 'y'}}
60fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  int abc=1;
7ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  long idx=abc+3*5; // expected-warning {{never read}} expected-warning{{unused variable 'idx'}}
8aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek}
98aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek
1049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f2(void *b) {
118aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek char *c = (char*)b; // no-warning
12ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek char *d = b+1; // expected-warning {{never read}} expected-warning{{unused variable 'd'}}
135faf5d31fa634e1fdb576c4d9708cd4efa5ea310Jean-Daniel Dupas printf("%s", c); // expected-warning{{implicitly declaring library function 'printf' with type 'int (const char *, ...)'}} \
14a316e7b735b12ce6b34961a9dcfaae34f4b08d29Douglas Gregor // expected-note{{please include the header <stdio.h> or explicitly provide a declaration for 'printf'}}
158aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek}
1674c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek
17e030358cc06e1cbce3c2e00ca67c946f9164b2a8Chris Lattnerint f();
18e030358cc06e1cbce3c2e00ca67c946f9164b2a8Chris Lattner
1949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f3() {
200fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  int r;
210fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  if ((r = f()) != 0) { // no-warning
220fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek    int y = r; // no-warning
230fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek    printf("the error is: %d\n", y);
240fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  }
2574c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek}
2649a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
2749a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f4(int k) {
2849a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
2949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek  k = 1;
3049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
3149a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek  if (k)
3249a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek    f1();
3349a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
341a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  k = 2;  // expected-warning {{never read}}
3549a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek}
3693fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek
37f87821c086a46411883b385c743996a35cc8e154Ted Kremenekvoid f5() {
38f87821c086a46411883b385c743996a35cc8e154Ted Kremenek
39f87821c086a46411883b385c743996a35cc8e154Ted Kremenek  int x = 4; // no-warning
40ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  int *p = &x; // expected-warning{{never read}} expected-warning{{unused variable 'p'}}
41f87821c086a46411883b385c743996a35cc8e154Ted Kremenek
42a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek}
43a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek
44f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek//
45a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenekint f6() {
46a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek
47a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek  int x = 4;
48f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek  ++x; // no-warning
49a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek  return 1;
50a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek}
511a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek
521a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f7(int *p) {
531a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  // This is allowed for defensive programming.
541a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  p = 0; // no-warning
551a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  return 1;
561a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek}
571a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek
5893fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenekint f7b(int *p) {
5993fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  // This is allowed for defensive programming.
6093fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  p = (0); // no-warning
6193fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  return 1;
6293fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek}
6393fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek
6493fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenekint f7c(int *p) {
6593fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  // This is allowed for defensive programming.
6693fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  p = (void*) 0; // no-warning
6793fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  return 1;
6893fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek}
6993fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek
7093fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenekint f7d(int *p) {
7193fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  // This is allowed for defensive programming.
7293fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  p = (void*) (0); // no-warning
7393fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek  return 1;
7493fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek}
7593fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek
7656b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// Don't warn for dead stores in nested expressions.  We have yet
7756b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// to see a real bug in this scenario.
781a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f8(int *p) {
794489fe10fa073eb326e2c8906db170f009050911Daniel Dunbar  extern int *baz();
8056b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek  if ((p = baz())) // no-warning
811a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek    return 1;
821a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  return 0;
831a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek}
841a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek
852cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f9() {
862cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  int x = 4;
872cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  x = x + 10; // expected-warning{{never read}}
882cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  return 1;
892cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek}
902cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
912cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f10() {
922cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  int x = 4;
932cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  x = 10 + x; // expected-warning{{never read}}
942cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  return 1;
952cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek}
962cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
978b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenekint f11() {
988b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek  int x = 4;
99380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek  return x++; // expected-warning{{never read}}
1008b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek}
1018b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek
102380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenekint f11b() {
103380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek  int x = 4;
1047f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek  return ((((++x)))); // no-warning
105380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek}
106380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek
107fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12a(int y) {
108ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  int x = y;  // expected-warning{{unused variable 'x'}}
109fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  return 1;
110fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek}
111fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12b(int y) {
112fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  int x __attribute__((unused)) = y;  // no-warning
113fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  return 1;
114fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek}
115ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenekint f12c(int y) {
116ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  // Allow initialiation of scalar variables by parameters as a form of
117ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  // defensive programming.
118ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  int x = y;  // no-warning
119ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  x = 1;
120ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  return x;
121ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek}
1222cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
123efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek// Filed with PR 2630.  This code should produce no warnings.
124efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenekint f13(void)
125efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek{
126efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  int a = 1;
127efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  int b, c = b = a + a;
128efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
129efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  if (b > 0)
130efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek    return (0);
131efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
132efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  return (a + b + c);
133efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek}
134efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
135b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek// Filed with PR 2763.
13684fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekint f14(int count) {
137b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  int index, nextLineIndex;
138b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  for (index = 0; index < count; index = nextLineIndex+1) {
139b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek    nextLineIndex = index+1;  // no-warning
140b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek    continue;
141b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  }
142b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  return index;
143b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek}
14484fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek
14584fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek// Test case for <rdar://problem/6248086>
14684fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekvoid f15(unsigned x, unsigned y) {
14784fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek  int count = x * y;   // no-warning
148ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  int z[count]; // expected-warning{{unused variable 'z'}}
14984fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek}
15084fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek
15156b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// Don't warn for dead stores in nested expressions.  We have yet
15256b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// to see a real bug in this scenario.
153610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenekint f16(int x) {
154610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek  x = x * 2;
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x = sizeof(int [x = (x || x + 1) * 2])
156d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek      ? 5 : 8;
157610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek  return x;
158610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek}
159610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek
1603b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek// Self-assignments should not be flagged as dead stores.
161a5495eadc816b29954e22df55aa9a9d6bb41429cMike Stumpvoid f17() {
1623b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek  int x = 1;
163ef52bcb606c73950139a775af61495f63fbc3603Tom Care  x = x;
1643b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek}
1657f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek
1667f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// <rdar://problem/6506065>
1677f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// The values of dead stores are only "consumed" in an enclosing expression
168cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump// what that value is actually used.  In other words, don't say "Although the
169cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump// value stored to 'x' is used...".
1707f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenekint f18() {
1717f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   int x = 0; // no-warning
1727f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   if (1)
1737f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;  // expected-warning{{Value stored to 'x' is never read}}
1747f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   while (1)
1757f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;  // expected-warning{{Value stored to 'x' is never read}}
176848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek   // unreachable.
1777f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   do
178848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek      x = 10;   // no-warning
1797f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   while (1);
180848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek   return (x = 10); // no-warning
181848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek}
1827f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek
183848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekint f18_a() {
184848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek   int x = 0; // no-warning
18556b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek   return (x = 10); // no-warning
1867f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek}
187d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek
188848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid f18_b() {
189848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek   int x = 0; // no-warning
190848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek   if (1)
191848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek      x = 10;  // expected-warning{{Value stored to 'x' is never read}}
192848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek}
193848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek
194848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid f18_c() {
195848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  int x = 0;
196848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  while (1)
197848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek     x = 10;  // expected-warning{{Value stored to 'x' is never read}}
198848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek}
199848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek
200848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid f18_d() {
201848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  int x = 0; // no-warning
202848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  do
203848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek     x = 10;   // expected-warning{{Value stored to 'x' is never read}}
204848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  while (1);
205848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek}
206848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek
207d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek// PR 3514: false positive `dead initialization` warning for init to global
208d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek//  http://llvm.org/bugs/show_bug.cgi?id=3514
209d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekextern const int MyConstant;
210d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekint f19(void) {
211d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  int x = MyConstant;  // no-warning
212d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  x = 1;
213d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  return x;
214d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek}
215d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek
21628433ff063fe5ba5eac486d4bfcfa9e210097772Ted Kremenekint f19b(void) { // This case is the same as f19.
217d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  const int MyConstant = 0;
21828433ff063fe5ba5eac486d4bfcfa9e210097772Ted Kremenek  int x = MyConstant; // no-warning
219d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  x = 1;
220d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  return x;
221d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek}
222632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek
223632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenekvoid f20(void) {
224632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek  int x = 1; // no-warning
225632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek#pragma unused(x)
226632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek}
227632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek
228cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stumpvoid halt() __attribute__((noreturn));
229cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stumpint f21() {
230cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  int x = 4;
231cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump
232f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek  x = x + 1; // expected-warning{{never read}}
233cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  if (1) {
234cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump    halt();
235cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump    (void)x;
236cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  }
237cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  return 1;
238cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump}
239e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump
240e5af3ce53ec58995b09381ba645ab2117a46647bMike Stumpint j;
241e5af3ce53ec58995b09381ba645ab2117a46647bMike Stumpvoid f22() {
242e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int x = 4;
243e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y1 = 4;
244e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y2 = 4;
245e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y3 = 4;
246e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y4 = 4;
247e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y5 = 4;
248e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y6 = 4;
249e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y7 = 4;
250e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y8 = 4;
251e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y9 = 4;
252e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y10 = 4;
2535f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  int y11 = 4;
2545f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  int y12 = 4;
255fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  int y13 = 4;
256fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  int y14 = 4;
257fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  int y15 = 4;
2588f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  int y16 = 4;
2598f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  int y17 = 4;
2608f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  int y18 = 4;
26122cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  int y19 = 4;
26222cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  int y20 = 4;
263e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump
264f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek  x = x + 1; // expected-warning{{never read}}
265e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y1;
266e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y2;
267e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y3;
268e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y4;
269e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y5;
270e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y6;
271e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y7;
272e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y8;
273e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y9;
274e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y10;
2755f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  ++y11;
2765f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  ++y12;
277fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  ++y13;
278fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  ++y14;
279fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  ++y15;
2808f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  ++y16;
2818f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  ++y17;
2828f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  ++y18;
28322cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  ++y19;
28422cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  ++y20;
285e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump
286e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  switch (j) {
287e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 1:
288e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (0)
289e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)x;
290e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (1) {
291e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)y1;
292e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      return;
293e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    }
294e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
295e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
296e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 2:
297e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (0)
298e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)x;
299e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    else {
300e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)y2;
301e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      return;
302e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    }
303e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
304e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
305e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 3:
306e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (1) {
307e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)y3;
308e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      return;
309e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    } else
310e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)x;
311e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
312e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  break;
313e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 4:
314e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    0 ? : ((void)y4, ({ return; }));
315e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
316e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
317e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 5:
318e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    1 ? : (void)x;
319e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    0 ? (void)x : ((void)y5, ({ return; }));
320e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
321e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
322e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 6:
323e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    1 ? ((void)y6, ({ return; })) : (void)x;
324e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
325e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
326e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 7:
327e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)(0 && x);
328e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)y7;
3291b2ad2fd9e2d5352144481aa1fd995d333d9adc9Argyrios Kyrtzidis    (void)(0 || (y8, ({ return; }), 1));  // expected-warning {{expression result unused}}
330e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
331e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
332e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 8:
3331b2ad2fd9e2d5352144481aa1fd995d333d9adc9Argyrios Kyrtzidis    (void)(1 && (y9, ({ return; }), 1));  // expected-warning {{expression result unused}}
334e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
335e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
336e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 9:
337e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)(1 || x);
338e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)y10;
3395f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    break;
3405f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  case 10:
3418f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    while (0) {
3428f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)x;
3435f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    }
3448f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)y11;
3455f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    break;
3465f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  case 11:
3478f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    while (1) {
3488f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y12;
3495f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    }
3508f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)x;
3515f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    break;
352fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  case 12:
3538f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    do {
354fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump      (void)y13;
3558f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    } while (0);
3568f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)y14;
3578f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    break;
3588f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 13:
3598f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    do {
3608f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y15;
3618f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    } while (1);
3628f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)x;
3638f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    break;
3648f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 14:
3658f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    for (;;) {
3668f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y16;
367fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    }
368fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    (void)x;
369fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    break;
3708f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 15:
371fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    for (;1;) {
3728f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y17;
373fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    }
374fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    (void)x;
375fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    break;
3768f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 16:
377fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    for (;0;) {
378fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump      (void)x;
379fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    }
3808f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)y18;
381fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    break;
38222cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  case 17:
38322cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    __builtin_choose_expr(0, (void)x, ((void)y19, ({ return; })));
38422cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    (void)x;
38522cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    break;
38622cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  case 19:
38722cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    __builtin_choose_expr(1, ((void)y20, ({ return; })), (void)x);
38822cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    (void)x;
38922cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    break;
390e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  }
391e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump}
3923a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek
3933a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23_aux(const char* s);
3943a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23(int argc, char **argv) {
3953a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  int shouldLog = (argc > 1); // no-warning
3963a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  ^{
3973a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek     if (shouldLog) f23_aux("I did too use it!\n");
3983a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek     else f23_aux("I shouldn't log.  Wait.. d'oh!\n");
3993a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  }();
4003a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek}
4013a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek
4023a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23_pos(int argc, char **argv) {
403ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek  int shouldLog = (argc > 1); // expected-warning{{Value stored to 'shouldLog' during its initialization is never read}} expected-warning{{unused variable 'shouldLog'}}
4043a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  ^{
4053a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek     f23_aux("I did too use it!\n");
4063a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  }();
4073a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek}
4089a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
4099a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekvoid f24_A(int y) {
4109a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  // FIXME: One day this should be reported as dead since 'z = x + y' is dead.
4119a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  int x = (y > 2); // no-warning
4129a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^ {
413ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek      int z = x + y; // expected-warning{{Value stored to 'z' during its initialization is never read}} expected-warning{{unused variable 'z'}}
4149a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
4159a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
4169a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
4179a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekvoid f24_B(int y) {
4189a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  // FIXME: One day this should be reported as dead since 'x' is just overwritten.
4199a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  __block int x = (y > 2); // no-warning
4209a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^{
4219a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    // FIXME: This should eventually be a dead store since it is never read either.
4229a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    x = 5; // no-warning
4239a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
4249a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
4259a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
4269a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekint f24_C(int y) {
4279a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  // FIXME: One day this should be reported as dead since 'x' is just overwritten.
4289a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  __block int x = (y > 2); // no-warning
4299a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^{
4309a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    x = 5; // no-warning
4319a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
4329a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  return x;
4339a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
4349a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
4359a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekint f24_D(int y) {
4369a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  __block int x = (y > 2); // no-warning
4379a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^{
4389a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    if (y > 4)
4399a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek      x = 5; // no-warning
4409a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
4419a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  return x;
4429a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
4439a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
44474635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// This example shows that writing to a variable captured by a block means that it might
44574635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// not be dead.
44674635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenekint f25(int y) {
44774635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  __block int x = (y > 2);
44874635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  __block int z = 0;
44974635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  void (^foo)() = ^{ z = x + y; };
45074635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  x = 4; // no-warning
45174635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  foo();
45274635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  return z;
45374635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek}
45474635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek
45574635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// This test is mostly the same as 'f25', but shows that the heuristic of pruning out dead
45674635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// stores for variables that are just marked '__block' is overly conservative.
45774635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenekint f25_b(int y) {
45874635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  // FIXME: we should eventually report a dead store here.
45974635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  __block int x = (y > 2);
46074635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  __block int z = 0;
46174635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  x = 4; // no-warning
46274635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek  return z;
46374635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek}
46474635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek
4652cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenekint f26_nestedblocks() {
4662cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek  int z;
4672cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek  z = 1;
4682cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek  __block int y = 0;
4692cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek  ^{
4702cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek    int k;
4712cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek    k = 1; // expected-warning{{Value stored to 'k' is never read}}
4722cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek    ^{
4732cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek        y = z + 1;
4742cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek     }();
4752cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek  }();
4762cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek  return y;
4772cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek}
4782cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek
4793f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek// The FOREACH macro in QT uses 'break' statements within statement expressions
4803f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek// placed within the increment code of for loops.
4813f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenekvoid rdar8014335() {
4823f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek  for (int i = 0 ; i != 10 ; ({ break; })) {
483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for ( ; ; ({ ++i; break; })) ; // expected-warning {{'break' is bound to current loop, GCC binds it to the enclosing loop}}
4843f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek    // Note that the next value stored to 'i' is never executed
4853f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek    // because the next statement to be executed is the 'break'
4863f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek    // in the increment code of the first loop.
487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    i = i * 3; // expected-warning{{Value stored to 'i' is never read}}
4883f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek  }
4893f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek}
4903f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek
491334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek// <rdar://problem/8320674> NullStmts followed by do...while() can lead to disconnected CFG
492334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek//
493334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek// This previously caused bogus dead-stores warnings because the body of the first do...while was
494334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek// disconnected from the entry of the function.
495334c19566104d3333cf662f0017088a18eddfa81Ted Kremenektypedef struct { float r; float i; } s_rdar8320674;
496334c19566104d3333cf662f0017088a18eddfa81Ted Kremenektypedef struct { s_rdar8320674 x[1]; } s2_rdar8320674;
497334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek
498334c19566104d3333cf662f0017088a18eddfa81Ted Kremenekvoid rdar8320674(s_rdar8320674 *z, unsigned y, s2_rdar8320674 *st, int m)
499334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek{
500334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek    s_rdar8320674 * z2;
501334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek    s_rdar8320674 * tw1 = st->x;
502334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek    s_rdar8320674 t;
503334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek    z2 = z + m;
504334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek    do{
505334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek        ; ;
506334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek        do{ (t).r = (*z2).r*(*tw1).r - (*z2).i*(*tw1).i; (t).i = (*z2).r*(*tw1).i + (*z2).i*(*tw1).r; }while(0);
507334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek        tw1 += y;
508334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek        do { (*z2).r=(*z).r-(t).r; (*z2).i=(*z).i-(t).i; }while(0);
509334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek        do { (*z).r += (t).r; (*z).i += (t).i; }while(0);
510334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek        ++z2;
511334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek        ++z;
512334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek    }while (--m);
513334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek}
514334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek
515848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek// Avoid dead stores resulting from an assignment (and use) being unreachable.
516848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid rdar8405222_aux(int i);
517848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid rdar8405222() {
518848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  const int show = 0;
519848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  int i = 0;
520848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek
521848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  if (show)
522848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek      i = 5; // no-warning
523848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek
524848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek  if (show)
525848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek    rdar8405222_aux(i);
526848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek}
527848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek
528bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek// Look through chains of assignements, e.g.: int x = y = 0, when employing
529bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek// silencing heuristics.
530bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenekint radar11185138_foo() {
531bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  int x, y;
532bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  x = y = 0; // expected-warning {{never read}}
533bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  return y;
534bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek}
535bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek
536bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenekint rdar11185138_bar() {
537bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  int y;
538bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  int x = y = 0; // no-warning
539bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  x = 2;
540bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  y = 2;
541bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  return x + y;
542bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek}
543bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek
544bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenekint *radar11185138_baz() {
545bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  int *x, *y;
546bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  x = y = 0; // no-warning
547bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek  return y;
548bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek}
549bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek
5509ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaksint getInt();
5519ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaksint *getPtr();
5529ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaksvoid testBOComma() {
5539ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x0 = (getInt(), 0); // expected-warning{{unused variable 'x0'}}
5549ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x1 = (getInt(), getInt()); // expected-warning {{Value stored to 'x1' during its initialization is never read}} // expected-warning{{unused variable 'x1'}}
5559ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x2 = (getInt(), getInt(), getInt()); //expected-warning{{Value stored to 'x2' during its initialization is never read}} // expected-warning{{unused variable 'x2'}}
5569ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x3;
5579ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  x3 = (getInt(), getInt(), 0); // expected-warning{{Value stored to 'x3' is never read}}
5589ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x4 = (getInt(), (getInt(), 0)); // expected-warning{{unused variable 'x4'}}
5599ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int y;
5609ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x5 = (getInt(), (y = 0)); // expected-warning{{unused variable 'x5'}}
5619ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x6 = (getInt(), (y = getInt())); //expected-warning {{Value stored to 'x6' during its initialization is never read}} // expected-warning{{unused variable 'x6'}}
5629ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x7 = 0, x8 = getInt(); //expected-warning {{Value stored to 'x8' during its initialization is never read}} // expected-warning{{unused variable 'x8'}} // expected-warning{{unused variable 'x7'}}
5639ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int x9 = getInt(), x10 = 0; //expected-warning {{Value stored to 'x9' during its initialization is never read}} // expected-warning{{unused variable 'x9'}}  // expected-warning{{unused variable 'x10'}}
5649ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int m = getInt(), mm, mmm; //expected-warning {{Value stored to 'm' during its initialization is never read}} // expected-warning{{unused variable 'm'}} // expected-warning{{unused variable 'mm'}} // expected-warning{{unused variable 'mmm'}}
5659ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int n, nn = getInt(); //expected-warning {{Value stored to 'nn' during its initialization is never read}} // expected-warning{{unused variable 'n'}} // expected-warning{{unused variable 'nn'}}
5669ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks
5679ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  int *p;
5689ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks  p = (getPtr(), (int *)0); // no warning
5699ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks
5709ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks}
5719ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks
572