1c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions -Wno-tautological-undefined-compare
2c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions -Wno-tautological-undefined-compare
3d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose
4d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rosevoid clang_analyzer_warnIfReached();
5d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek
653287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek// Test basic handling of references.
7d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar &test1_aux();
8d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar *test1() {
9d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek  return &test1_aux();
10d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek}
1153287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek
12910e4080986045cc2036f8d1f55398acc7fbb257Zhongxing Xu// Test test1_aux() evaluates to char &.
1353287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenekchar test1_as_rvalue() {
1453287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek  return test1_aux();
1553287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek}
1653287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek
17949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// Test passing a value as a reference.  The 'const' in test2_aux() adds
18949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// an ImplicitCastExpr, which is evaluated as an lvalue.
19949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_aux(const int &n);
20949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2(int n) {
21949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek  return test2_aux(n);
22949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek}
23949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek
24949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b_aux(const short &n);
25949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b(int n) {
26949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek  return test2_b_aux(n);
27949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek}
28077a40df258beb46cb746af61da115e9718a6affTed Kremenek
29077a40df258beb46cb746af61da115e9718a6affTed Kremenek// Test getting the lvalue of a derived and converting it to a base.  This
30077a40df258beb46cb746af61da115e9718a6affTed Kremenek// previously crashed.
31077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Base {};
32077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Derived : public Test3_Base {};
33077a40df258beb46cb746af61da115e9718a6affTed Kremenek
34077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3_aux(Test3_Base &x);
35077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3(Test3_Derived x) {
36077a40df258beb46cb746af61da115e9718a6affTed Kremenek  return test3_aux(x);
37077a40df258beb46cb746af61da115e9718a6affTed Kremenek}
38077a40df258beb46cb746af61da115e9718a6affTed Kremenek
39de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
40de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test CFG support for C++ condition variables.
41de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
42de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
4361dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition_aux();
4461dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition() {
4561dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  if (int x = test_init_in_condition_aux()) { // no-warning
4661dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek    return 1;
4761dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  }
4861dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  return 0;
4961dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek}
50fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek
51fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenekint test_init_in_condition_switch() {
52fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek  switch (int x = test_init_in_condition_aux()) { // no-warning
53fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    case 1:
54fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      return 0;
55fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    case 2:
56fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      if (x == 2)
57fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        return 0;
58fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      else {
59d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose        clang_analyzer_warnIfReached();  // unreachable
60fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      }
61fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    default:
62fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      break;
63fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek  }
64fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek  return 0;
65fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek}
664c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek
674c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenekint test_init_in_condition_while() {
684ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  int z = 0;
694ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  while (int x = ++z) { // no-warning
704ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek    if (x == 2)
714c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek      break;
724c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek  }
734ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek
744ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  if (z == 2)
754ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek    return 0;
764ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek
77d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // unreachable
784c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek  return 0;
794c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek}
804ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek
81dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek
82dd8b44101281c894026c7070da6e826c542ea87bTed Kremenekint test_init_in_condition_for() {
83dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  int z = 0;
84dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  for (int x = 0; int y = ++z; ++x) {
85dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek    if (x == y) // no-warning
86dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek      break;
87dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  }
88dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  if (z == 1)
89dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek    return 0;
90dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek
91d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // unreachable
92dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  return 0;
93dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek}
94de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
95de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
96de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test handling of 'this' pointer.
97de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
98de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
99de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekclass TestHandleThis {
100de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int x;
101de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
102de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  TestHandleThis();
103de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int foo();
104de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int null_deref_negative();
105de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int null_deref_positive();
106de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
107de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
108de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::foo() {
109de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  // Assume that 'x' is initialized.
110de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return x + 1; // no-warning
111de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
112de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
113de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_negative() {
114de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  x = 10;
115de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  if (x == 10) {
116de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return 1;
117de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
118d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // unreachable
119de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return 0;
120de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
121de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
122de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_positive() {
123de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  x = 10;
124de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  if (x == 9) {
125de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return 1;
126de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
127d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
128de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return 0;
129de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
130de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
131741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek// PR 7675 - passing literals by-reference
132741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const double &a);
133741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const int &a);
134741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const char &a);
135741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_i(const _Complex double &a);
136741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek
137741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_test() {
138741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675(10.0);
139741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675(10);
140741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675('c');
141741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675_i(4.0i);
142d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose
143d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  // Add check to ensure we are analyzing the code up to this point.
144d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
145741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek}
146741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek
147a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek// <rdar://problem/8375510> - CFGBuilder should handle temporaries.
148a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekstruct R8375510 {
149a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  R8375510();
150a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  ~R8375510();
151a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  R8375510 operator++(int);
152a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek};
153a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek
154a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekint r8375510(R8375510 x, R8375510 y) {
155a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  for (; ; x++) { }
156a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek}
157a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek
15899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan// PR8419 -- this used to crash.
15999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
16099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanclass String8419 {
16199cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan public:
16299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  char& get(int n);
16399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  char& operator[](int n);
16499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan};
16599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
16699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanchar& get8419();
16799cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
16899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanvoid Test8419() {
16999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  String8419 s;
17099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  ++(s.get(0));
17199cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  get8419()--;  // used to crash
17299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  --s[0];       // used to crash
17399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  s[0] &= 1;    // used to crash
17499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  s[0]++;       // used to crash
17599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan}
17699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
177739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8426 -- this used to crash.
178739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
179739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Use(void* to);
180739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
181739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> class Foo {
182739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  ~Foo();
183739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  struct Bar;
184739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Bar* bar_;
185739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
186739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
187739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> Foo<T>::~Foo() {
188739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Use(bar_);
189739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  T::DoSomething();
190739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  bar_->Work();
191739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
192739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
193739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8427 -- this used to crash.
194739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
195739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Dummy {};
196739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
197739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool operator==(Dummy, int);
198739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
199739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
200739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo2 {
201739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  bool Bar();
202739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
203739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
204739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
205739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool Foo2<T>::Bar() {
206739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  return 0 == T();
207739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
208739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
209739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8433 -- this used to crash.
210739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
211739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
212739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo3 {
213739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan public:
214739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  void Bar();
215739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  void Baz();
216739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  T value_;
217739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
218739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
219739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
220739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Foo3<T>::Bar() {
221739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Baz();
222739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  value_();
223739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
224b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
225b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===//
226b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek// Handle misc. C++ constructs.
227b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===//
228b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
229b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremeneknamespace fum {
230b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  int i = 3;
231b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek};
232b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
233b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenekvoid test_namespace() {
234b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  // Previously triggered a crash.
235b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  using namespace fum;
236b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  int x = i;
237b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek}
238b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
239b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// Test handling methods that accept references as parameters, and that
240b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// variables are properly invalidated.
241b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekclass RDar9203355 {
242b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  bool foo(unsigned valA, long long &result) const;
243b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  bool foo(unsigned valA, int &result) const;
244b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek};
245b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekbool RDar9203355::foo(unsigned valA, int &result) const {
246b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  long long val;
247b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  if (foo(valA, val) ||
248b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek      (int)val != val) // no-warning
249b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek    return true;
250b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  result = val; // no-warning
251b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  return false;
252b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek}
253b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
25441c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek// Test handling of new[].
25541c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenekvoid rdar9212512() {
25641c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  int *x = new int[10];
25741c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  for (unsigned i = 0 ; i < 2 ; ++i) {
25841c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek    // This previously triggered an uninitialized values warning.
25941c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek    x[i] = 1;  // no-warning
26041c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  }
26141c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek}
262b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
26394ae8fd470471134114599ccfc2301da05719212Ted Kremenek// Test basic support for dynamic_cast<>.
26494ae8fd470471134114599ccfc2301da05719212Ted Kremenekstruct Rdar9212495_C { virtual void bar() const; };
26594ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_B : public Rdar9212495_C {};
26694ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_A : public Rdar9212495_B {};
26794ae8fd470471134114599ccfc2301da05719212Ted Kremenekconst Rdar9212495_A& rdar9212495(const Rdar9212495_C* ptr) {
26894ae8fd470471134114599ccfc2301da05719212Ted Kremenek  const Rdar9212495_A& val = dynamic_cast<const Rdar9212495_A&>(*ptr);
26994ae8fd470471134114599ccfc2301da05719212Ted Kremenek
2709f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  // This is not valid C++; dynamic_cast with a reference type will throw an
271a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose  // exception if the pointer does not match the expected type. However, our
272a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose  // implementation of dynamic_cast will pass through a null pointer...or a
273a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose  // "null reference"! So this branch is actually possible.
27494ae8fd470471134114599ccfc2301da05719212Ted Kremenek  if (&val == 0) {
275a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose    val.bar(); // expected-warning{{Called C++ object pointer is null}}
27694ae8fd470471134114599ccfc2301da05719212Ted Kremenek  }
27794ae8fd470471134114599ccfc2301da05719212Ted Kremenek
27894ae8fd470471134114599ccfc2301da05719212Ted Kremenek  return val;
27994ae8fd470471134114599ccfc2301da05719212Ted Kremenek}
28094ae8fd470471134114599ccfc2301da05719212Ted Kremenek
2819f3b9d54ccbbf212591602f389ebde7923627490Jordan Roseconst Rdar9212495_A* rdar9212495_ptr(const Rdar9212495_C* ptr) {
2829f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  const Rdar9212495_A* val = dynamic_cast<const Rdar9212495_A*>(ptr);
2839f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose
2849f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  if (val == 0) {
2859f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose    val->bar(); // expected-warning{{Called C++ object pointer is null}}
2869f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  }
2879f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose
2889f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  return val;
2899f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose}
2909f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose
2915fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek// Test constructors invalidating arguments.  Previously this raised
2925fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek// an uninitialized value warning.
2935fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekextern "C" void __attribute__((noreturn)) PR9645_exit(int i);
2945fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
2955fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekclass PR9645_SideEffect
2965fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek{
2975fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekpublic:
2985fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  PR9645_SideEffect(int *pi); // caches pi in i_
2995fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  void Read(int *pi); // copies *pi into *i_
3005fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekprivate:
3015fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  int *i_;
3025fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek};
3035fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3045fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekvoid PR9645() {
3055fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  int i;
3065fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3075fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  PR9645_SideEffect se(&i);
3085fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  int j = 1;
3095fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  se.Read(&j); // this has a side-effect of initializing i.
3105fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3115fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  PR9645_exit(i); // no-warning
3125fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek}
3135fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3145fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed KremenekPR9645_SideEffect::PR9645_SideEffect(int *pi) : i_(pi) {}
3155fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekvoid PR9645_SideEffect::Read(int *pi) { *i_ = *pi; }
3169fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
3179fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek// Invalidate fields during C++ method calls.
3189fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekclass RDar9267815 {
3199fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  int x;
3209fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void test();
3219fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void test_pos();
3229fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void test2();
3239fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void invalidate();
3249fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek};
3259fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
3269fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test_pos() {
3279fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3289fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    return;
329d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
3309fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek}
3319fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test() {
3329fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3339fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    return;
3349fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
335d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // no-warning
3369fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek}
3379fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
3389fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test2() {
3399fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3409fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    return;
3419fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  invalidate();
3429fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
343d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
3449fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek}
3459fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
346235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek// Test reference parameters.
347235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenekvoid test_ref_double_aux(double &Value);
348235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenekfloat test_ref_double() {
349235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  double dVal;
350235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  test_ref_double_aux(dVal);
351235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  // This previously warned because 'dVal' was thought to be uninitialized.
352235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  float Val = (float)dVal; // no-warning
353235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  return Val;
354235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek}
355235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek
356bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek// Test invalidation of class fields.
357bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekclass TestInvalidateClass {
358bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekpublic:
359bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  int x;
360bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek};
361bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek
362bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekvoid test_invalidate_class_aux(TestInvalidateClass &x);
363bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek
364bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekint test_invalidate_class() {
365bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  TestInvalidateClass y;
366bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  test_invalidate_class_aux(y);
367bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  return y.x; // no-warning
368bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek}
369bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek
3703bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek// Test correct pointer arithmetic using 'p--'.  This is to warn that we
3713bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek// were loading beyond the written characters in buf.
3723bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenekchar *RDar9269695(char *dst, unsigned int n)
3733bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek{
3743bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  char buff[40], *p;
3753bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3763bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  p = buff;
3773bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  do
3783bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek    *p++ = '0' + n % 10;
3793bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  while (n /= 10);
3803bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3813bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  do
3823bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek    *dst++ = *--p; // no-warning
3833bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  while (p != buff);
3843bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3853bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  return dst;
3863bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek}
3873bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3889d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek// Test that we invalidate byref arguments passed to constructors.
3899d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekclass TestInvalidateInCtor {
3909d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekpublic:
3919d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  TestInvalidateInCtor(unsigned &x);
3929d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek};
3939d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek
3949d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekunsigned test_invalidate_in_ctor() {
3959d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  unsigned x;
3969d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  TestInvalidateInCtor foo(x);
3979d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  return x; // no-warning
3989d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek}
3999d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekunsigned test_invalidate_in_ctor_new() {
4009d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  unsigned x;
4019d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  delete (new TestInvalidateInCtor(x));
4029d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  return x; // no-warning
4039d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek}
4043bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
405c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek// Test assigning into a symbolic offset.
406c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenekstruct TestAssignIntoSymbolicOffset {
407c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  int **stuff[100];
408c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  void test(int x, int y);
409c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek};
410c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek
411c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenekvoid TestAssignIntoSymbolicOffset::test(int x, int y) {
412c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  x--;
413c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  if (x > 8 || x < 0)
414c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    return;
415c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  if (stuff[x])
416c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    return;
417c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  if (!stuff[x]) {
418c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    stuff[x] = new int*[y+1];
419c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    // Previously triggered a null dereference.
420c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    stuff[x][y] = 0; // no-warning
421c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  }
422c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek}
423c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek
4245bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek// Test loads from static fields.  This previously triggered an uninitialized
4255bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek// value warning.
4265bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekclass ClassWithStatic {
4275bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekpublic:
4285bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    static const unsigned value = 1;
4295bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek};
4305bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek
4315bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekint rdar9948787_negative() {
4325bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    ClassWithStatic classWithStatic;
4335bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    unsigned value = classWithStatic.value;
4345bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    if (value == 1)
4355bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek      return 1;
436d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // no-warning
4375bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    return 0;
4385bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek}
4395bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek
4405bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekint rdar9948787_positive() {
4415bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    ClassWithStatic classWithStatic;
4425bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    unsigned value = classWithStatic.value;
4435bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    if (value == 0)
4445bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek      return 1;
445d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
4465bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    return 0;
4475bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek}
4485bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek
449e4c6675cccbaac991843def43072687bca50d989Ted Kremenek// Regression test against global constants and switches.
450e4c6675cccbaac991843def43072687bca50d989Ted Kremenekenum rdar10202899_ValT { rdar10202899_ValTA, rdar10202899_ValTB, rdar10202899_ValTC };
451e4c6675cccbaac991843def43072687bca50d989Ted Kremenekconst rdar10202899_ValT val = rdar10202899_ValTA;
452e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test1() {
453e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  switch (val) {
454e4c6675cccbaac991843def43072687bca50d989Ted Kremenek    case rdar10202899_ValTA: {}
455e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  };
456e4c6675cccbaac991843def43072687bca50d989Ted Kremenek}
457e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
458e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test2() {
459e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  if (val == rdar10202899_ValTA)
460e4c6675cccbaac991843def43072687bca50d989Ted Kremenek   return;
461d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // no-warning
462e4c6675cccbaac991843def43072687bca50d989Ted Kremenek}
463e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
464e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test3() {
465e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  switch (val) {
466e4c6675cccbaac991843def43072687bca50d989Ted Kremenek    case rdar10202899_ValTA: return;
467e4c6675cccbaac991843def43072687bca50d989Ted Kremenek    default: ;
468e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  };
469d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose  clang_analyzer_warnIfReached();  // no-warning
470e4c6675cccbaac991843def43072687bca50d989Ted Kremenek}
471e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
472e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II// This used to crash the analyzer because of the unnamed bitfield.
473e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow IIvoid PR11249()
474e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II{
475e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  struct {
476e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char f1:4;
477e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char   :4;
478e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char f2[1];
479e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char f3;
480e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  } V = { 1, {2}, 3 };
481e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  if (V.f1 != 1)
482d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // no-warning
483e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  if (V.f2[0] != 2)
484d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // no-warning
485e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  if (V.f3 != 3)
486d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // no-warning
487e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II}
488e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
489214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek// Handle doing a load from the memory associated with the code for
490214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek// a function.
491214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenekextern double nan( const char * );
492214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenekdouble PR11450() {
493214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek  double NaN = *(double*) nan;
494214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek  return NaN;
495214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek}
496214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek
49760a4481fd9e5dc68b1070306bd70f2865985961dTed Kremenek// Test that 'this' is assumed non-null upon analyzing the entry to a "top-level"
498a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek// function (i.e., when not analyzing from a specific caller).
499a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenekstruct TestNullThis {
500a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  int field;
501a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  void test();
502a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek};
503a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek
504a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenekvoid TestNullThis::test() {
505a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  int *p = &field;
506a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  if (p)
507a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek    return;
508a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  field = 2; // no-warning
509a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek}
510a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek
511337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek// Test handling of 'catch' exception variables, and not warning
512337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek// about uninitialized values.
513337e4dbc6859589b8878146a88bebf754e916702Ted Kremenekenum MyEnum { MyEnumValue };
514337e4dbc6859589b8878146a88bebf754e916702Ted KremenekMyEnum rdar10892489() {
515337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  try {
516337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek      throw MyEnumValue;
517337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  } catch (MyEnum e) {
518337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek      return e; // no-warning
519337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  }
520337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  return MyEnumValue;
521337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek}
522337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek
523337e4dbc6859589b8878146a88bebf754e916702Ted KremenekMyEnum rdar10892489_positive() {
524337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  try {
525337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek    throw MyEnumValue;
526337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  } catch (MyEnum e) {
527337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek    int *p = 0;
528c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    // FALSE NEGATIVE
529c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    *p = 0xDEADBEEF; // {{null}}
530337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek    return e;
531337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  }
532337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  return MyEnumValue;
533337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek}
534337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek
535ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek// Test handling of catch with no condition variable.
536ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenekvoid PR11545() {
537ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  try
538ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
539ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek      throw;
540ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
541ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  catch (...)
542ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
543ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
544ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek}
545ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek
546ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenekvoid PR11545_positive() {
547ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  try
548ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
549ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek      throw;
550ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
551ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  catch (...)
552ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
553ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek    int *p = 0;
554c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    // FALSE NEGATIVE
555c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    *p = 0xDEADBEEF; // {{null}}
556ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
557ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek}
558ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek
5595aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// Test handling taking the address of a field.  While the analyzer
5605aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// currently doesn't do anything intelligent here, this previously
5615aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// resulted in a crash.
5625aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekclass PR11146 {
5635aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekpublic:
5645aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  struct Entry;
5655aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  void baz();
5665aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek};
5675aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek
5685aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekstruct PR11146::Entry {
5695aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  int x;
5705aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek};
5715aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek
5725aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekvoid PR11146::baz() {
5735aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  (void) &Entry::x;
5745aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek}
575b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek
576b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// Test symbolicating a reference.  In this example, the
577b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// analyzer (originally) didn't know how to handle x[index - index2],
578b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// returning an UnknownVal.  The conjured symbol wasn't a location,
579b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// and would result in a crash.
580b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenekvoid rdar10924675(unsigned short x[], int index, int index2) {
581b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek  unsigned short &y = x[index - index2];
582b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek  if (y == 0)
583b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek    return;
584b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek}
585c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek
586c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek// Test handling CXXScalarValueInitExprs.
587c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenekvoid rdar11401827() {
588c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  int x = int();
589c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  if (!x) {
590d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    ; // Suppress warning that both branches are identical
592c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  }
593c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  else {
594d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // no-warning
595c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  }
596c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek}
597c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek
59810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek//===---------------------------------------------------------------------===//
59910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek// Handle inlining of C++ method calls.
60010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek//===---------------------------------------------------------------------===//
60110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek
60210f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenekstruct A {
60310f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  int *p;
60410f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  void foo(int *q) {
60510f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek    p = q;
60610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  }
60710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  void bar() {
60810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek    *p = 0; // expected-warning {{null pointer}}
60910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  }
61010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek};
61110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek
61210f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenekvoid test_inline() {
61310f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  A a;
61410f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  a.foo(0);
61510f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  a.bar();
61610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek}
61710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek
618dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaksvoid test_alloca_in_a_recursive_function(int p1) {
619dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks    __builtin_alloca (p1);
620dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks    test_alloca_in_a_recursive_function(1);
621dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks    test_alloca_in_a_recursive_function(2);
622dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks}
623bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek
624bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek//===---------------------------------------------------------------------===//
625bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// Random tests.
626bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek//===---------------------------------------------------------------------===//
627bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek
628bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// Tests assigning using a C-style initializer to a struct
629bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// variable whose sub-field is also a struct.  This currently
630bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// results in a CXXTempObjectRegion being created, but not
631bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// properly handled.  For now, we just ignore that value
632bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// to avoid a crash (<rdar://problem/12753384>).
633bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekstruct RDar12753384_ClassA {
634bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  unsigned z;
635bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek};
636bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekstruct  RDar12753384_ClassB {
637bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  unsigned x;
638bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  RDar12753384_ClassA y[ 8 ] ;
639bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek};
640bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekunsigned RDar12753384() {
641bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  RDar12753384_ClassB w = { 0x00 };
642bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  RDar12753384_ClassA y[8];
643bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  return w.x;
644bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek}
645bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek
6461994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// This testcase tests whether we treat the anonymous union and union
6471994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// the same way.  This previously resulted in a "return of stack address"
6481994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// warning because the anonymous union resulting in a temporary object
6491994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// getting put into the initializer.  We still aren't handling this correctly,
6501994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// but now if a temporary object appears in an initializer we just ignore it.
6511994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// Fixes <rdar://problem/12755044>.
6521994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6531994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekstruct Rdar12755044_foo
6541994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek{
6551994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    struct Rdar12755044_bar
6561994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    {
6571994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        union baz
6581994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        {
6591994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek            int   i;
6601994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        };
6611994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    } aBar;
6621994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek};
6631994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6641994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekstruct Rdar12755044_foo_anon
6651994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek{
6661994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    struct Rdar12755044_bar
6671994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    {
6681994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        union
6691994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        {
6701994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek            int   i;
6711994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        };
6721994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    } aBar;
6731994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek};
6741994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6751994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekconst Rdar12755044_foo_anon *radar12755044_anon() {
6761994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  static const Rdar12755044_foo_anon Rdar12755044_foo_list[] = { { { } } };
6771994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  return Rdar12755044_foo_list; // no-warning
6781994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek}
6791994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6801994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekconst Rdar12755044_foo *radar12755044() {
6811994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  static const Rdar12755044_foo Rdar12755044_foo_list[] = { { { } } };
6821994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  return Rdar12755044_foo_list; // no-warning
6831994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek}
6849c0466603f2051fec9270686dfcd270630e62530Ted Kremenek
6859c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// Test the correct handling of integer to bool conversions.  Previously
6869c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// this resulted in a false positive because integers were being truncated
6879c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// and not tested for non-zero.
6889c0466603f2051fec9270686dfcd270630e62530Ted Kremenekvoid rdar12759044() {
6899c0466603f2051fec9270686dfcd270630e62530Ted Kremenek  int flag = 512;
6909c0466603f2051fec9270686dfcd270630e62530Ted Kremenek  if (!(flag & 512)) {
691d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose    clang_analyzer_warnIfReached();  // no-warning
6929c0466603f2051fec9270686dfcd270630e62530Ted Kremenek  }
6939c0466603f2051fec9270686dfcd270630e62530Ted Kremenek}
694beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek
695beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek// The analyzer currently does not model complex types.  Test that the load
696beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek// from 'x' is not flagged as being uninitialized.
697beac9e3772e255f89dad0abe34811953121912b2Ted Kremenektypedef __complex__ float _ComplexT;
698beac9e3772e255f89dad0abe34811953121912b2Ted Kremenekvoid rdar12964481(_ComplexT *y) {
699beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   _ComplexT x;
700beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   __real__ x = 1.0;
701beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   __imag__ x = 1.0;
702beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   *y *= x; // no-warning
703beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek}
704beac9e3772e255f89dad0abe34811953121912b2Ted Kremenekvoid rdar12964481_b(_ComplexT *y) {
705beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   _ComplexT x;
706beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   // Eventually this should be a warning.
707beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   *y *= x; // no-warning
708beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek}
709beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek
71088de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek// Test case for PR 12921.  This previously produced
71188de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek// a bogus warning.
71288de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekstatic const int pr12921_arr[] = { 0, 1 };
71388de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekstatic const int pr12921_arrcount = sizeof(pr12921_arr)/sizeof(int);
71488de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek
71588de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekint pr12921(int argc, char **argv) {
71688de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  int i, retval;
71788de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  for (i = 0; i < pr12921_arrcount; i++) {
71888de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek    if (argc == i) {
71988de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek      retval = i;
72088de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek      break;
72188de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek    }
72288de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  }
72388de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek
72488de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  // No match
72588de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  if (i == pr12921_arrcount) return 66;
72688de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  return pr12921_arr[retval];
72788de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek}
72888de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek
729