1 // RUN: %clang_analyze_cc1 -analyzer-checker=core.NullDereference,core.uninitialized.UndefReturn -std=c++11 %s -verify -o /dev/null
2 
test_static_assert()3 void test_static_assert() {
4   static_assert(sizeof(void *) == sizeof(void*), "test_static_assert");
5 }
6 
test_analyzer_working()7 void test_analyzer_working() {
8   int *p = 0;
9   *p = 0xDEADBEEF; // expected-warning {{null}}
10 }
11 
12 // Test that pointer-to-member functions don't cause the analyzer
13 // to crash.
14 struct RDar10243398 {
15   void bar(int x);
16 };
17 
18 typedef void (RDar10243398::*RDar10243398MemberFn)(int x);
19 
test_rdar10243398(RDar10243398 * p)20 void test_rdar10243398(RDar10243398 *p) {
21   RDar10243398MemberFn q = &RDar10243398::bar;
22   ((*p).*(q))(1);
23 }
24 
25 // Tests for CXXTemporaryObjectExpr.
26 struct X {
27     X( int *ip, int );
28 };
29 
30 // Test to see if CXXTemporaryObjectExpr is being handled.
tempobj1()31 int tempobj1()
32 {
33   int j;
34   int i;
35   X a = X( &j, 1 );
36 
37   return i; // expected-warning {{Undefined or garbage value returned to caller}}
38 }
39 
40 // Test to see if CXXTemporaryObjectExpr invalidates arguments.
tempobj2()41 int tempobj2()
42 {
43   int j;
44   X a = X( &j, 1 );
45 
46   return j; // no-warning
47 }
48 
49 
50 // Test for correct handling of C++ ForRange statement.
test1()51 void test1() {
52   int array[2] = { 1, 2 };
53   int j = 0;
54   for ( int i : array )
55     j += i;
56   int *p = 0;
57   *p = 0xDEADBEEF;  // expected-warning {{null}}
58 }
59 
test2()60 void test2() {
61   int array[2] = { 1, 2 };
62   int j = 0;
63   for (int i : array)
64     j += i;
65   if (j == 3)
66     return;
67   int *p = 0;
68   *p = 0xDEADBEEF;  // no-warning
69 }
70 
71 // Do not crash on the following when constructing the
72 // callgraph.
73 struct RDar11178609 {
74   ~RDar11178609() = delete;
75 };
76 
77 // Tests that dynamic_cast handles references to C++ classes.  Previously
78 // this crashed.
79 class rdar11817693_BaseBase {};
80 class rdar11817693_BaseInterface {};
81 class rdar11817693_Base : public rdar11817693_BaseBase, public rdar11817693_BaseInterface {};
82 class rdar11817693 : public rdar11817693_Base {
83   virtual void operator=(const rdar11817693_BaseBase& src);
84   void operator=(const rdar11817693& src);
85 };
operator =(const rdar11817693 & src)86 void rdar11817693::operator=(const rdar11817693& src) {
87   operator=(dynamic_cast<const rdar11817693_BaseBase&>(src));
88 }
89 
90