1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-checker=alpha.deadcode.IdempotentOperations -verify %s
2db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
3db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care// Basic tests
4db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
5db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Careextern void test(int i);
6453293109e670824d84e94c0c2891737e3261f1fTed Kremenekextern void test_f(float f);
7db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
8245adabd97c8c770c13935a9075f2243cc6f1d57Tom Careunsigned basic() {
9db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  int x = 10, zero = 0, one = 1;
10db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
11db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  // x op x
123e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  x = x;        // expected-warning {{Assigned value is always the same as the existing value}}
133e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x - x);  // expected-warning {{Both operands to '-' always have the same value}}
143e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  x -= x;       // expected-warning {{Both operands to '-=' always have the same value}}
15db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  x = 10;       // no-warning
163e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x / x);  // expected-warning {{Both operands to '/' always have the same value}}
173e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  x /= x;       // expected-warning {{Both operands to '/=' always have the same value}}
18db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  x = 10;       // no-warning
193e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x & x);  // expected-warning {{Both operands to '&' always have the same value}}
203e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  x &= x;       // expected-warning {{Both operands to '&=' always have the same value}}
213e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x | x);  // expected-warning {{Both operands to '|' always have the same value}}
223e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  x |= x;       // expected-warning {{Both operands to '|=' always have the same value}}
23db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
24db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  // x op 1
253e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x * one);  // expected-warning {{The right operand to '*' is always 1}}
263e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  x *= one;       // expected-warning {{The right operand to '*=' is always 1}}
273e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x / one);  // expected-warning {{The right operand to '/' is always 1}}
283e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  x /= one;       // expected-warning {{The right operand to '/=' is always 1}}
29db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
30db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  // 1 op x
313e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(one * x);   // expected-warning {{The left operand to '*' is always 1}}
32db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
33db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  // x op 0
343e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x + zero);  // expected-warning {{The right operand to '+' is always 0}}
353e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x - zero);  // expected-warning {{The right operand to '-' is always 0}}
363e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x * zero);  // expected-warning {{The right operand to '*' is always 0}}
373e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x & zero);  // expected-warning {{The right operand to '&' is always 0}}
383e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x | zero);  // expected-warning {{The right operand to '|' is always 0}}
393e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x ^ zero);  // expected-warning {{The right operand to '^' is always 0}}
403e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x << zero); // expected-warning {{The right operand to '<<' is always 0}}
413e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(x >> zero); // expected-warning {{The right operand to '>>' is always 0}}
42db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
43db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  // 0 op x
443e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero + x);  // expected-warning {{The left operand to '+' is always 0}}
453e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero - x);  // expected-warning {{The left operand to '-' is always 0}}
463e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero / x);  // expected-warning {{The left operand to '/' is always 0}}
473e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero * x);  // expected-warning {{The left operand to '*' is always 0}}
483e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero & x);  // expected-warning {{The left operand to '&' is always 0}}
493e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero | x);  // expected-warning {{The left operand to '|' is always 0}}
503e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero ^ x);  // expected-warning {{The left operand to '^' is always 0}}
513e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero << x); // expected-warning {{The left operand to '<<' is always 0}}
523e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek  test(zero >> x); // expected-warning {{The left operand to '>>' is always 0}}
53245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care
54db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  // Overwrite the values so these aren't marked as Pseudoconstants
55245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  x = 1;
56245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  zero = 2;
57245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  one = 3;
58245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care
59245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  return x + zero + one;
60db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care}
61453293109e670824d84e94c0c2891737e3261f1fTed Kremenek
62453293109e670824d84e94c0c2891737e3261f1fTed Kremenekvoid floats(float x) {
63a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care  test_f(x * 1.0);  // no-warning
64453293109e670824d84e94c0c2891737e3261f1fTed Kremenek  test_f(x * 1.0F); // no-warning
65453293109e670824d84e94c0c2891737e3261f1fTed Kremenek}
66d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care
67a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care// Ensure that we don't report false poitives in complex loops
68d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Carevoid bailout() {
69a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care  int unused = 0, result = 4;
70a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care  result = result; // expected-warning {{Assigned value is always the same as the existing value}}
71d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care
72a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care  for (unsigned bg = 0; bg < 1024; bg ++) {
73a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care    result = bg * result; // no-warning
74d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care
75d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care    for (int i = 0; i < 256; i++) {
76a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care      unused *= i; // no-warning
77d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care    }
78d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care  }
79d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care}
80a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care
816d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care// Relaxed liveness - check that we don't kill liveness at assignments
826d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Caretypedef unsigned uintptr_t;
836d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Carevoid kill_at_assign() {
846d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care  short array[2];
85ade3195a201e16e989e9f93a568fb1806519077cTed Kremenek  uintptr_t x = (uintptr_t) array;
86ade3195a201e16e989e9f93a568fb1806519077cTed Kremenek  short *p = (short *) x;
876d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care
886d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care  // The following branch should be infeasible.
896d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care  if (!(p = &array[0])) { // expected-warning{{Assigned value is always the same as the existing value}}
906d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care    p = 0;
916d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care    *p = 1; // no-warning
926d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care  }
936d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care}
946d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care
95a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care// False positive tests
96a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care
97a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careunsigned false1() {
9850e8ac2369951d200e0d3849465d481f20fbdb62Tom Care  int a = 10;
9950e8ac2369951d200e0d3849465d481f20fbdb62Tom Care  return a * (5 - 2 - 3); // no-warning
100a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care}
101a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care
102a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careenum testenum { enum1 = 0, enum2 };
103a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careunsigned false2() {
10450e8ac2369951d200e0d3849465d481f20fbdb62Tom Care  int a = 1234;
10550e8ac2369951d200e0d3849465d481f20fbdb62Tom Care  return enum1 + a; // no-warning
106a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care}
107a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care
108ef52bcb606c73950139a775af61495f63fbc3603Tom Care// Self assignments of unused variables are common false positives
109ef52bcb606c73950139a775af61495f63fbc3603Tom Careunsigned false3(int param, int param2) {
110245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  param = param; // no-warning
111245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care
112ef52bcb606c73950139a775af61495f63fbc3603Tom Care  // if a self assigned variable is used later, then it should be reported still
113ef52bcb606c73950139a775af61495f63fbc3603Tom Care  param2 = param2; // expected-warning{{Assigned value is always the same as the existing value}}
114ef52bcb606c73950139a775af61495f63fbc3603Tom Care
115245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  unsigned nonparam = 5;
116245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care
117245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  nonparam = nonparam; // expected-warning{{Assigned value is always the same as the existing value}}
118245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care
119ef52bcb606c73950139a775af61495f63fbc3603Tom Care  return param2 + nonparam;
120245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care}
121245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care
122db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Pseudo-constants (vars only read) and constants should not be reported
123245adabd97c8c770c13935a9075f2243cc6f1d57Tom Careunsigned false4() {
124245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  // Trivial constant
125db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  const int height = 1;
126823894110e6f161a29450dbdea44ab987cfe16bbTom Care  int c = 42;
127823894110e6f161a29450dbdea44ab987cfe16bbTom Care  test(height * c); // no-warning
128db34ab70961ca4b24b600eb47053d7af304659f5Tom Care
129823894110e6f161a29450dbdea44ab987cfe16bbTom Care  // Pseudo-constant (never changes after decl)
130823894110e6f161a29450dbdea44ab987cfe16bbTom Care  int width = height;
131823894110e6f161a29450dbdea44ab987cfe16bbTom Care
132245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care  return width * 10; // no-warning
133245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care}
134db34ab70961ca4b24b600eb47053d7af304659f5Tom Care
135967fea6cd9ae60ea31d27d440967990d2c705729Tom Care// Block pseudoconstants
136967fea6cd9ae60ea31d27d440967990d2c705729Tom Carevoid false4a() {
137967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  // Pseudo-constant
138967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  __block int a = 1;
139967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  int b = 10;
140967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  __block int c = 0;
141967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  b *= a; // no-warning
142967fea6cd9ae60ea31d27d440967990d2c705729Tom Care
143967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  ^{
144967fea6cd9ae60ea31d27d440967990d2c705729Tom Care    // Psuedoconstant block var
145967fea6cd9ae60ea31d27d440967990d2c705729Tom Care    test(b * c); // no-warning
146967fea6cd9ae60ea31d27d440967990d2c705729Tom Care
147967fea6cd9ae60ea31d27d440967990d2c705729Tom Care    // Non-pseudoconstant block var
148967fea6cd9ae60ea31d27d440967990d2c705729Tom Care    int d = 0;
149967fea6cd9ae60ea31d27d440967990d2c705729Tom Care    test(b * d); // expected-warning{{The right operand to '*' is always 0}}
150967fea6cd9ae60ea31d27d440967990d2c705729Tom Care    d = 5;
151967fea6cd9ae60ea31d27d440967990d2c705729Tom Care    test(d);
152967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  }();
153967fea6cd9ae60ea31d27d440967990d2c705729Tom Care
154967fea6cd9ae60ea31d27d440967990d2c705729Tom Care  test(a + b);
155967fea6cd9ae60ea31d27d440967990d2c705729Tom Care}
156967fea6cd9ae60ea31d27d440967990d2c705729Tom Care
157db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Static vars are common false positives
158db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint false5() {
159db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  static int test = 0;
160db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  int a = 56;
161db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  a *= test; // no-warning
162db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  test++;
163db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  return a;
164db34ab70961ca4b24b600eb47053d7af304659f5Tom Care}
165db34ab70961ca4b24b600eb47053d7af304659f5Tom Care
166db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Non-local storage vars are considered false positives
167db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint globalInt = 1;
168db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint false6() {
169db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  int localInt = 23;
170db34ab70961ca4b24b600eb47053d7af304659f5Tom Care
171db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  localInt /= globalInt;
172db34ab70961ca4b24b600eb47053d7af304659f5Tom Care
173db34ab70961ca4b24b600eb47053d7af304659f5Tom Care  return localInt;
174db34ab70961ca4b24b600eb47053d7af304659f5Tom Care}
1756216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care
1766216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care// Check that assignments filter out false positives correctly
1776216dc0c5b9071b4c10f78718a64ca916c00a384Tom Careint false7() {
178fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  int zero = 0; // pseudo-constant
1796216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care  int one = 1;
1806216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care
1816216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care  int a = 55;
1826216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care  a = a; // expected-warning{{Assigned value is always the same as the existing value}}
1836216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care  a = enum1 * a; // no-warning
1846216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care
1856216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care  int b = 123;
1866216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care  b = b; // no-warning
1876216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care
1886216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care  return a;
1896216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care}
19084c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care
19184c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care// Check truncations do not flag as self-assignments
19284c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Carevoid false8() {
19384c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care  int a = 10000000;
19484c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care  a = (short)a; // no-warning
19584c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care  test(a);
19684c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care}
19702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek
19802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek// This test case previously flagged a warning at 'b == c' because the
19902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek// analyzer previously allowed 'UnknownVal' as the index for ElementRegions.
20002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenektypedef struct RDar8431728_F {
20102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  int RDar8431728_A;
20202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  unsigned char *RDar8431728_B;
20302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  int RDar8431728_E[6];
20402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek} RDar8431728_D;
20502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenekstatic inline int RDar8431728_C(RDar8431728_D * s, int n,
20602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek    unsigned char **RDar8431728_B_ptr) {
20702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  int xy, wrap, pred, a, b, c;
20802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek
20902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  xy = s->RDar8431728_E[n];
21002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  wrap = s->RDar8431728_A;
21102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek
21202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  a = s->RDar8431728_B[xy - 1];
21302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  b = s->RDar8431728_B[xy - 1 - wrap];
21402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  c = s->RDar8431728_B[xy - wrap];
21502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek
21602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  if (b == c) { // no-warning
21702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek    pred = a;
21802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  } else {
21902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek    pred = c;
22002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  }
22102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek
22202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  *RDar8431728_B_ptr = &s->RDar8431728_B[xy];
22302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek
22402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  return pred;
22502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek}
22602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek
22774faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek// <rdar://problem/8601243> - Don't warn on pointer arithmetic.  This
22874faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek// is often idiomatic.
22974faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenekunsigned rdar8601243_aux(unsigned n);
23074faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenekvoid rdar8601243() {
23174faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek  char arr[100];
23274faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek  char *start = arr;
23374faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek  start = start + rdar8601243_aux(sizeof(arr) - (arr - start)); // no-warning
23474faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek  (void) start;
23574faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek}
23674faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek
237791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose
238791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rosefloat testFloatCast(int i) {
239791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose  float f = i;
240791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose
241791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose  // Don't crash when trying to create a "zero" float.
242791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose  return f - f;
243791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose}
244791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose
245