1 // RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -triple x86_64-apple-darwin12 -std=c++11 %s 2>&1 | FileCheck %s 2 3 // CHECK: ENTRY 4 // CHECK-NEXT: Succs (1): B1 5 // CHECK: [B1] 6 // CHECK: Succs (21): B2 B3 B4 B5 B6 B7 B8 B9 7 // CHECK: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 8 // CHECK: B20 B21 B0 9 // CHECK: [B0 (EXIT)] 10 // CHECK-NEXT: Preds (21): B2 B3 B4 B5 B6 B7 B8 B9 11 // CHECK-NEXT: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 12 // CHECK-NEXT: B20 B21 B1 13 void checkWrap(int i) { 14 switch(i) { 15 case 0: break; 16 case 1: break; 17 case 2: break; 18 case 3: break; 19 case 4: break; 20 case 5: break; 21 case 6: break; 22 case 7: break; 23 case 8: break; 24 case 9: break; 25 case 10: break; 26 case 11: break; 27 case 12: break; 28 case 13: break; 29 case 14: break; 30 case 15: break; 31 case 16: break; 32 case 17: break; 33 case 18: break; 34 case 19: break; 35 } 36 } 37 38 // CHECK: ENTRY 39 // CHECK-NEXT: Succs (1): B1 40 // CHECK: [B1] 41 // CHECK-NEXT: 1: int i; 42 // CHECK-NEXT: 2: int j; 43 // CHECK-NEXT: 3: 1 44 // CHECK-NEXT: 4: int k = 1; 45 // CHECK-NEXT: 5: int l; 46 // CHECK-NEXT: 6: 2 47 // CHECK-NEXT: 7: int m = 2; 48 // CHECK-NEXT: CXXConstructExpr 49 // CHECK-NEXT: 9: struct standalone myStandalone; 50 // CHECK-NEXT: CXXConstructExpr 51 // CHECK-NEXT: 11: struct <anonymous struct at {{.*}}> myAnon; 52 // CHECK-NEXT: CXXConstructExpr 53 // CHECK-NEXT: 13: struct named myNamed; 54 // CHECK-NEXT: Preds (1): B2 55 // CHECK-NEXT: Succs (1): B0 56 void checkDeclStmts() { 57 int i, j; 58 int k = 1, l, m = 2; 59 60 struct standalone { int x, y; }; 61 struct standalone myStandalone; 62 63 struct { int x, y; } myAnon; 64 65 struct named { int x, y; } myNamed; 66 67 static_assert(1, "abc"); 68 } 69 70 // CHECK: ENTRY 71 // CHECK-NEXT: Succs (1): B1 72 // CHECK: [B1] 73 // CHECK-NEXT: 1: e 74 // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, enum EmptyE) 75 // CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, IntegralCast, int) 76 // CHECK-NEXT: T: switch [B1.3] 77 // CHECK-NEXT: Preds (1): B2 78 // CHECK-NEXT: Succs (1): B0 79 // CHECK: [B0 (EXIT)] 80 // CHECK-NEXT: Preds (1): B1 81 enum EmptyE {}; 82 void F(EmptyE e) { 83 switch (e) {} 84 } 85 86 // CHECK: ENTRY 87 // CHECK-NEXT: Succs (1): B1 88 // CHECK: [B1] 89 // CHECK-NEXT: 1: __builtin_object_size 90 // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, BuiltinFnToFnPtr, unsigned long (*)(const void *, int)) 91 // CHECK-NEXT: 3: [B1.2](dummy(), 0) 92 // CHECK-NEXT: 4: (void)[B1.3] (CStyleCastExpr, ToVoid, void) 93 // CHECK-NEXT: Preds (1): B2 94 // CHECK-NEXT: Succs (1): B0 95 // CHECK: [B0 (EXIT)] 96 // CHECK-NEXT: Preds (1): B1 97 void testBuiltinSize() { 98 extern int *dummy(); 99 (void)__builtin_object_size(dummy(), 0); 100 } 101 102 103 class A { 104 public: 105 A() {} 106 ~A() {} 107 }; 108 109 // CHECK: [B2 (ENTRY)] 110 // CHECK-NEXT: Succs (1): B1 111 // CHECK: [B1] 112 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 113 // CHECK-NEXT: 2: new A([B1.1]) 114 // CHECK-NEXT: 3: A *a = new A(); 115 // CHECK-NEXT: 4: a 116 // CHECK-NEXT: 5: [B1.4] (ImplicitCastExpr, LValueToRValue, class A *) 117 // CHECK-NEXT: 6: [B1.5]->~A() (Implicit destructor) 118 // CHECK-NEXT: 7: delete [B1.5] 119 // CHECK-NEXT: Preds (1): B2 120 // CHECK-NEXT: Succs (1): B0 121 // CHECK: [B0 (EXIT)] 122 // CHECK-NEXT: Preds (1): B1 123 void test_deletedtor() { 124 A *a = new A(); 125 delete a; 126 } 127 128 // CHECK: [B2 (ENTRY)] 129 // CHECK-NEXT: Succs (1): B1 130 // CHECK: [B1] 131 // CHECK-NEXT: 1: 5 132 // CHECK-NEXT: 2: (CXXConstructExpr, class A) 133 // CHECK-NEXT: 3: new A {{\[\[}}B1.1]] 134 // CHECK-NEXT: 4: A *a = new A [5]; 135 // CHECK-NEXT: 5: a 136 // CHECK-NEXT: 6: [B1.5] (ImplicitCastExpr, LValueToRValue, class A *) 137 // CHECK-NEXT: 7: [B1.6]->~A() (Implicit destructor) 138 // CHECK-NEXT: 8: delete [] [B1.6] 139 // CHECK-NEXT: Preds (1): B2 140 // CHECK-NEXT: Succs (1): B0 141 // CHECK: [B0 (EXIT)] 142 // CHECK-NEXT: Preds (1): B1 143 void test_deleteArraydtor() { 144 A *a = new A[5]; 145 delete[] a; 146 } 147 148 149 namespace NoReturnSingleSuccessor { 150 struct A { 151 A(); 152 ~A(); 153 }; 154 155 struct B : public A { 156 B(); 157 ~B() __attribute__((noreturn)); 158 }; 159 160 // CHECK: ENTRY 161 // CHECK: 1: 1 162 // CHECK-NEXT: 2: return 163 // CHECK-NEXT: ~B() (Implicit destructor) 164 // CHECK-NEXT: Preds (1) 165 // CHECK-NEXT: Succs (1): B0 166 int test1(int *x) { 167 B b; 168 if (x) 169 return 1; 170 } 171 172 // CHECK: ENTRY 173 // CHECK: 1: 1 174 // CHECK-NEXT: 2: return 175 // CHECK-NEXT: destructor 176 // CHECK-NEXT: Preds (1) 177 // CHECK-NEXT: Succs (1): B0 178 int test2(int *x) { 179 const A& a = B(); 180 if (x) 181 return 1; 182 } 183 } 184