dead-stores.c revision 9a0459c0f59a09ac7287ca1f49083fc6b31e4142
13a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -warn-dead-stores -fblocks -verify %s
23a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -warn-dead-stores -fblocks -verify %s
33a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=basic -analyzer-constraints=range -warn-dead-stores -fblocks -verify %s
43a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=basic -warn-dead-stores -fblocks -verify %s
53a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek// RUN: clang-cc -analyze -analyzer-experimental-internal-checks -checker-cfref -analyzer-store=region -analyzer-constraints=range -warn-dead-stores -fblocks -verify %s
68aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek
749a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f1() {
8aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek  int k, y;
90fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  int abc=1;
101a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  long idx=abc+3*5; // expected-warning {{never read}}
11aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek}
128aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek
1349a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f2(void *b) {
148aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek char *c = (char*)b; // no-warning
151a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek char *d = b+1; // expected-warning {{never read}}
16a316e7b735b12ce6b34961a9dcfaae34f4b08d29Douglas Gregor printf("%s", c); // expected-warning{{implicitly declaring C library function 'printf' with type 'int (char const *, ...)'}} \
17a316e7b735b12ce6b34961a9dcfaae34f4b08d29Douglas Gregor // expected-note{{please include the header <stdio.h> or explicitly provide a declaration for 'printf'}}
188aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek}
1974c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek
2049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f3() {
210fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  int r;
220fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  if ((r = f()) != 0) { // no-warning
230fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek    int y = r; // no-warning
240fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek    printf("the error is: %d\n", y);
250fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  }
2674c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek}
2749a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
2849a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f4(int k) {
2949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
3049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek  k = 1;
3149a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
3249a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek  if (k)
3349a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek    f1();
3449a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
351a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  k = 2;  // expected-warning {{never read}}
3649a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek}
3793fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek
38f87821c086a46411883b385c743996a35cc8e154Ted Kremenekvoid f5() {
39f87821c086a46411883b385c743996a35cc8e154Ted Kremenek
40f87821c086a46411883b385c743996a35cc8e154Ted Kremenek  int x = 4; // no-warning
411a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  int *p = &x; // expected-warning{{never read}}
42f87821c086a46411883b385c743996a35cc8e154Ted Kremenek
43a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek}
44a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek
45a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenekint f6() {
46a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek
47a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek  int x = 4;
481a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  ++x; // expected-warning{{never read}}
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
761a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f8(int *p) {
774489fe10fa073eb326e2c8906db170f009050911Daniel Dunbar  extern int *baz();
78f66d5cd8926541099def3cb187d56eff60d3be99John McCall  if ((p = baz())) // expected-warning{{Although the value}}
791a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek    return 1;
801a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  return 0;
811a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek}
821a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek
832cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f9() {
842cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  int x = 4;
852cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  x = x + 10; // expected-warning{{never read}}
862cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  return 1;
872cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek}
882cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
892cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f10() {
902cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  int x = 4;
912cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  x = 10 + x; // expected-warning{{never read}}
922cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  return 1;
932cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek}
942cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
958b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenekint f11() {
968b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek  int x = 4;
97380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek  return x++; // expected-warning{{never read}}
988b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek}
998b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek
100380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenekint f11b() {
101380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek  int x = 4;
1027f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek  return ((((++x)))); // no-warning
103380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek}
104380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek
105fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12a(int y) {
106fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  int x = y;  // expected-warning{{never read}}
107fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  return 1;
108fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek}
109fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12b(int y) {
110fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  int x __attribute__((unused)) = y;  // no-warning
111fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  return 1;
112fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek}
1132cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
114efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek// Filed with PR 2630.  This code should produce no warnings.
115efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenekint f13(void)
116efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek{
117efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  int a = 1;
118efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  int b, c = b = a + a;
119efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
120efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  if (b > 0)
121efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek    return (0);
122efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
123efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  return (a + b + c);
124efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek}
125efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
126b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek// Filed with PR 2763.
12784fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekint f14(int count) {
128b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  int index, nextLineIndex;
129b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  for (index = 0; index < count; index = nextLineIndex+1) {
130b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek    nextLineIndex = index+1;  // no-warning
131b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek    continue;
132b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  }
133b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  return index;
134b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek}
13584fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek
13684fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek// Test case for <rdar://problem/6248086>
13784fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekvoid f15(unsigned x, unsigned y) {
13884fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek  int count = x * y;   // no-warning
13984fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek  int z[count];
14084fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek}
14184fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek
142610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenekint f16(int x) {
143610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek  x = x * 2;
144d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek  x = sizeof(int [x = (x || x + 1) * 2]) // expected-warning{{Although the value stored to 'x' is used}}
145d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek      ? 5 : 8;
146610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek  return x;
147610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek}
148610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek
1493b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek// Self-assignments should not be flagged as dead stores.
150a5495eadc816b29954e22df55aa9a9d6bb41429cMike Stumpvoid f17() {
1513b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek  int x = 1;
1523b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek  x = x; // no-warning
1533b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek}
1547f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek
1557f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// <rdar://problem/6506065>
1567f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// The values of dead stores are only "consumed" in an enclosing expression
157cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump// what that value is actually used.  In other words, don't say "Although the
158cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump// value stored to 'x' is used...".
1597f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenekint f18() {
1607f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   int x = 0; // no-warning
1617f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   if (1)
1627f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;  // expected-warning{{Value stored to 'x' is never read}}
1637f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   while (1)
1647f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;  // expected-warning{{Value stored to 'x' is never read}}
1657f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   do
1667f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;   // expected-warning{{Value stored to 'x' is never read}}
1677f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   while (1);
1687f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek
1697f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   return (x = 10); // expected-warning{{Although the value stored to 'x' is used in the enclosing expression, the value is never actually read from 'x'}}
1707f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek}
171d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek
172d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek// PR 3514: false positive `dead initialization` warning for init to global
173d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek//  http://llvm.org/bugs/show_bug.cgi?id=3514
174d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekextern const int MyConstant;
175d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekint f19(void) {
176d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  int x = MyConstant;  // no-warning
177d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  x = 1;
178d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  return x;
179d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek}
180d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek
18128433ff063fe5ba5eac486d4bfcfa9e210097772Ted Kremenekint f19b(void) { // This case is the same as f19.
182d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  const int MyConstant = 0;
18328433ff063fe5ba5eac486d4bfcfa9e210097772Ted Kremenek  int x = MyConstant; // no-warning
184d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  x = 1;
185d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  return x;
186d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek}
187632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek
188632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenekvoid f20(void) {
189632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek  int x = 1; // no-warning
190632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek#pragma unused(x)
191632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek}
192632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek
193cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stumpvoid halt() __attribute__((noreturn));
194cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stumpint f21() {
195cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  int x = 4;
196cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump
197cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  ++x; // expected-warning{{never read}}
198cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  if (1) {
199cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump    halt();
200cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump    (void)x;
201cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  }
202cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump  return 1;
203cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump}
204e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump
205e5af3ce53ec58995b09381ba645ab2117a46647bMike Stumpint j;
206e5af3ce53ec58995b09381ba645ab2117a46647bMike Stumpvoid f22() {
207e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int x = 4;
208e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y1 = 4;
209e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y2 = 4;
210e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y3 = 4;
211e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y4 = 4;
212e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y5 = 4;
213e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y6 = 4;
214e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y7 = 4;
215e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y8 = 4;
216e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y9 = 4;
217e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  int y10 = 4;
2185f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  int y11 = 4;
2195f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  int y12 = 4;
220fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  int y13 = 4;
221fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  int y14 = 4;
222fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  int y15 = 4;
2238f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  int y16 = 4;
2248f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  int y17 = 4;
2258f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  int y18 = 4;
22622cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  int y19 = 4;
22722cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  int y20 = 4;
228e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump
229e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++x; // expected-warning{{never read}}
230e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y1;
231e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y2;
232e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y3;
233e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y4;
234e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y5;
235e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y6;
236e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y7;
237e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y8;
238e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y9;
239e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  ++y10;
2405f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  ++y11;
2415f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  ++y12;
242fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  ++y13;
243fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  ++y14;
244fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  ++y15;
2458f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  ++y16;
2468f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  ++y17;
2478f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  ++y18;
24822cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  ++y19;
24922cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  ++y20;
250e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump
251e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  switch (j) {
252e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 1:
253e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (0)
254e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)x;
255e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (1) {
256e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)y1;
257e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      return;
258e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    }
259e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
260e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
261e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 2:
262e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (0)
263e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)x;
264e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    else {
265e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)y2;
266e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      return;
267e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    }
268e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
269e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
270e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 3:
271e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    if (1) {
272e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)y3;
273e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      return;
274e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    } else
275e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump      (void)x;
276e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
277e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  break;
278e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 4:
279e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    0 ? : ((void)y4, ({ return; }));
280e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
281e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
282e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 5:
283e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    1 ? : (void)x;
284e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    0 ? (void)x : ((void)y5, ({ return; }));
285e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
286e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
287e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 6:
288e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    1 ? ((void)y6, ({ return; })) : (void)x;
289e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
290e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
291e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 7:
292e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)(0 && x);
293e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)y7;
294e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)(0 || (y8, ({ return; }), 1));
295e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
296e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
297e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 8:
298e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)(1 && (y9, ({ return; }), 1));
299e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)x;
300e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    break;
301e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  case 9:
302e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)(1 || x);
303e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump    (void)y10;
3045f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    break;
3055f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  case 10:
3068f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    while (0) {
3078f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)x;
3085f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    }
3098f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)y11;
3105f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    break;
3115f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump  case 11:
3128f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    while (1) {
3138f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y12;
3145f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    }
3158f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)x;
3165f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump    break;
317fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump  case 12:
3188f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    do {
319fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump      (void)y13;
3208f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    } while (0);
3218f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)y14;
3228f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    break;
3238f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 13:
3248f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    do {
3258f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y15;
3268f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    } while (1);
3278f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)x;
3288f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    break;
3298f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 14:
3308f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    for (;;) {
3318f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y16;
332fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    }
333fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    (void)x;
334fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    break;
3358f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 15:
336fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    for (;1;) {
3378f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump      (void)y17;
338fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    }
339fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    (void)x;
340fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    break;
3418f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump  case 16:
342fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    for (;0;) {
343fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump      (void)x;
344fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    }
3458f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump    (void)y18;
346fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump    break;
34722cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  case 17:
34822cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    __builtin_choose_expr(0, (void)x, ((void)y19, ({ return; })));
34922cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    (void)x;
35022cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    break;
35122cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump  case 19:
35222cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    __builtin_choose_expr(1, ((void)y20, ({ return; })), (void)x);
35322cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    (void)x;
35422cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump    break;
355e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump  }
356e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump}
3573a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek
3583a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23_aux(const char* s);
3593a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23(int argc, char **argv) {
3603a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  int shouldLog = (argc > 1); // no-warning
3613a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  ^{
3623a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek     if (shouldLog) f23_aux("I did too use it!\n");
3633a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek     else f23_aux("I shouldn't log.  Wait.. d'oh!\n");
3643a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  }();
3653a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek}
3663a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek
3673a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23_pos(int argc, char **argv) {
3683a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  int shouldLog = (argc > 1); // expected-warning{{Value stored to 'shouldLog' during its initialization is never read}}
3693a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  ^{
3703a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek     f23_aux("I did too use it!\n");
3713a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek  }();
3723a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek}
3739a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
3749a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekvoid f24_A(int y) {
3759a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  // FIXME: One day this should be reported as dead since 'z = x + y' is dead.
3769a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  int x = (y > 2); // no-warning
3779a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^ {
3789a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    int z = x + y; // FIXME: Eventually this should be reported as a dead store.
3799a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
3809a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
3819a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
3829a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekvoid f24_B(int y) {
3839a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  // FIXME: One day this should be reported as dead since 'x' is just overwritten.
3849a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  __block int x = (y > 2); // no-warning
3859a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^{
3869a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    // FIXME: This should eventually be a dead store since it is never read either.
3879a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    x = 5; // no-warning
3889a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
3899a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
3909a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
3919a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekint f24_C(int y) {
3929a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  // FIXME: One day this should be reported as dead since 'x' is just overwritten.
3939a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  __block int x = (y > 2); // no-warning
3949a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^{
3959a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    x = 5; // no-warning
3969a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
3979a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  return x;
3989a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
3999a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
4009a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekint f24_D(int y) {
4019a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  __block int x = (y > 2); // no-warning
4029a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  ^{
4039a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek    if (y > 4)
4049a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek      x = 5; // no-warning
4059a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  }();
4069a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek  return x;
4079a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek}
4089a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek
409