misc-ps-region-store.cpp revision 94ae8fd470471134114599ccfc2301da05719212
1c4d2c9074be6eb2091086eddd6c8f052f3b245c8Argyrios Kyrtzidis// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s
2c4d2c9074be6eb2091086eddd6c8f052f3b245c8Argyrios Kyrtzidis// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -verify -fblocks   -analyzer-opt-analyze-nested-blocks %s
3d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek
453287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek// Test basic handling of references.
5d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar &test1_aux();
6d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar *test1() {
7d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek  return &test1_aux();
8d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek}
953287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek
10910e4080986045cc2036f8d1f55398acc7fbb257Zhongxing Xu// Test test1_aux() evaluates to char &.
1153287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenekchar test1_as_rvalue() {
1253287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek  return test1_aux();
1353287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek}
1453287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek
15949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// Test passing a value as a reference.  The 'const' in test2_aux() adds
16949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// an ImplicitCastExpr, which is evaluated as an lvalue.
17949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_aux(const int &n);
18949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2(int n) {
19949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek  return test2_aux(n);
20949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek}
21949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek
22949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b_aux(const short &n);
23949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b(int n) {
24949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek  return test2_b_aux(n);
25949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek}
26077a40df258beb46cb746af61da115e9718a6affTed Kremenek
27077a40df258beb46cb746af61da115e9718a6affTed Kremenek// Test getting the lvalue of a derived and converting it to a base.  This
28077a40df258beb46cb746af61da115e9718a6affTed Kremenek// previously crashed.
29077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Base {};
30077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Derived : public Test3_Base {};
31077a40df258beb46cb746af61da115e9718a6affTed Kremenek
32077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3_aux(Test3_Base &x);
33077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3(Test3_Derived x) {
34077a40df258beb46cb746af61da115e9718a6affTed Kremenek  return test3_aux(x);
35077a40df258beb46cb746af61da115e9718a6affTed Kremenek}
36077a40df258beb46cb746af61da115e9718a6affTed Kremenek
37de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
38de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test CFG support for C++ condition variables.
39de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
40de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
4161dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition_aux();
4261dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition() {
4361dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  if (int x = test_init_in_condition_aux()) { // no-warning
4461dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek    return 1;
4561dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  }
4661dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  return 0;
4761dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek}
48fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek
49fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenekint test_init_in_condition_switch() {
50fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek  switch (int x = test_init_in_condition_aux()) { // no-warning
51fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    case 1:
52fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      return 0;
53fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    case 2:
54fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      if (x == 2)
55fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        return 0;
56fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      else {
57fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        // Unreachable.
58fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        int *p = 0;
59fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        *p = 0xDEADBEEF; // no-warning
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
774ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  int *p = 0;
784ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  *p = 0xDEADBEEF; // no-warning
794c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek  return 0;
804c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek}
814ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek
82dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek
83dd8b44101281c894026c7070da6e826c542ea87bTed Kremenekint test_init_in_condition_for() {
84dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  int z = 0;
85dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  for (int x = 0; int y = ++z; ++x) {
86dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek    if (x == y) // no-warning
87dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek      break;
88dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  }
89dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  if (z == 1)
90dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek    return 0;
91dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek
92dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  int *p = 0;
93dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  *p = 0xDEADBEEF; // no-warning
94dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  return 0;
95dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek}
96de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
97de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
98de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test handling of 'this' pointer.
99de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
100de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
101de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekclass TestHandleThis {
102de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int x;
103de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
104de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  TestHandleThis();
105de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int foo();
106de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int null_deref_negative();
107de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int null_deref_positive();
108de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
109de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
110de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::foo() {
111de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  // Assume that 'x' is initialized.
112de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return x + 1; // no-warning
113de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
114de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
115de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_negative() {
116de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  x = 10;
117de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  if (x == 10) {
118de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return 1;
119de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
120de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int *p = 0;
121de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  *p = 0xDEADBEEF; // no-warning
122de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return 0;
123de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
124de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
125de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_positive() {
126de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  x = 10;
127de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  if (x == 9) {
128de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return 1;
129de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
130de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int *p = 0;
131de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  *p = 0xDEADBEEF; // expected-warning{{null pointer}}
132de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return 0;
133de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
134de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
135741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek// PR 7675 - passing literals by-reference
136741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const double &a);
137741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const int &a);
138741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const char &a);
139741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_i(const _Complex double &a);
140741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek
141741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_test() {
142741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675(10.0);
143741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675(10);
144741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675('c');
145741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675_i(4.0i);
146741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  // Add null deref to ensure we are analyzing the code up to this point.
147741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  int *p = 0;
148741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  *p = 0xDEADBEEF; // expected-warning{{null pointer}}
149741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek}
150741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek
151a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek// <rdar://problem/8375510> - CFGBuilder should handle temporaries.
152a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekstruct R8375510 {
153a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  R8375510();
154a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  ~R8375510();
155a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  R8375510 operator++(int);
156a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek};
157a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek
158a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekint r8375510(R8375510 x, R8375510 y) {
159a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  for (; ; x++) { }
160a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek}
161a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek
16299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan// PR8419 -- this used to crash.
16399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
16499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanclass String8419 {
16599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan public:
16699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  char& get(int n);
16799cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  char& operator[](int n);
16899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan};
16999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
17099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanchar& get8419();
17199cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
17299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanvoid Test8419() {
17399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  String8419 s;
17499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  ++(s.get(0));
17599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  get8419()--;  // used to crash
17699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  --s[0];       // used to crash
17799cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  s[0] &= 1;    // used to crash
17899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  s[0]++;       // used to crash
17999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan}
18099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
181739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8426 -- this used to crash.
182739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
183739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Use(void* to);
184739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
185739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> class Foo {
186739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  ~Foo();
187739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  struct Bar;
188739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Bar* bar_;
189739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
190739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
191739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> Foo<T>::~Foo() {
192739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Use(bar_);
193739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  T::DoSomething();
194739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  bar_->Work();
195739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
196739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
197739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8427 -- this used to crash.
198739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
199739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Dummy {};
200739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
201739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool operator==(Dummy, int);
202739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
203739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
204739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo2 {
205739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  bool Bar();
206739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
207739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
208739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
209739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool Foo2<T>::Bar() {
210739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  return 0 == T();
211739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
212739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
213739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8433 -- this used to crash.
214739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
215739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
216739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo3 {
217739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan public:
218739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  void Bar();
219739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  void Baz();
220739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  T value_;
221739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
222739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
223739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
224739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Foo3<T>::Bar() {
225739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Baz();
226739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  value_();
227739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
228b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
229b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===//
230b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek// Handle misc. C++ constructs.
231b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===//
232b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
233b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremeneknamespace fum {
234b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  int i = 3;
235b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek};
236b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
237b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenekvoid test_namespace() {
238b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  // Previously triggered a crash.
239b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  using namespace fum;
240b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  int x = i;
241b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek}
242b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
243b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// Test handling methods that accept references as parameters, and that
244b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// variables are properly invalidated.
245b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekclass RDar9203355 {
246b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  bool foo(unsigned valA, long long &result) const;
247b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  bool foo(unsigned valA, int &result) const;
248b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek};
249b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekbool RDar9203355::foo(unsigned valA, int &result) const {
250b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  long long val;
251b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  if (foo(valA, val) ||
252b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek      (int)val != val) // no-warning
253b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek    return true;
254b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  result = val; // no-warning
255b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  return false;
256b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek}
257b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
25841c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek// Test handling of new[].
25941c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenekvoid rdar9212512() {
26041c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  int *x = new int[10];
26141c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  for (unsigned i = 0 ; i < 2 ; ++i) {
26241c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek    // This previously triggered an uninitialized values warning.
26341c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek    x[i] = 1;  // no-warning
26441c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  }
26541c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek}
266b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
26794ae8fd470471134114599ccfc2301da05719212Ted Kremenek// Test basic support for dynamic_cast<>.
26894ae8fd470471134114599ccfc2301da05719212Ted Kremenekstruct Rdar9212495_C { virtual void bar() const; };
26994ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_B : public Rdar9212495_C {};
27094ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_A : public Rdar9212495_B {};
27194ae8fd470471134114599ccfc2301da05719212Ted Kremenekconst Rdar9212495_A& rdar9212495(const Rdar9212495_C* ptr) {
27294ae8fd470471134114599ccfc2301da05719212Ted Kremenek  const Rdar9212495_A& val = dynamic_cast<const Rdar9212495_A&>(*ptr);
27394ae8fd470471134114599ccfc2301da05719212Ted Kremenek
27494ae8fd470471134114599ccfc2301da05719212Ted Kremenek  if (&val == 0) {
27594ae8fd470471134114599ccfc2301da05719212Ted Kremenek    val.bar(); // FIXME: This should eventually be a null dereference.
27694ae8fd470471134114599ccfc2301da05719212Ted Kremenek  }
27794ae8fd470471134114599ccfc2301da05719212Ted Kremenek
27894ae8fd470471134114599ccfc2301da05719212Ted Kremenek  return val;
27994ae8fd470471134114599ccfc2301da05719212Ted Kremenek}
28094ae8fd470471134114599ccfc2301da05719212Ted Kremenek
281