307 lines · cpp
1// RUN: %clang_analyze_cc1 -w -analyzer-checker=debug.DumpLiveExprs %s 2>&1\2// RUN: | FileCheck %s3 4int coin();5 6 7int testThatDumperWorks(int x, int y, int z) {8 return x ? y : z;9}10 11// [B5 (ENTRY)]12// |13// V14// [B4 (x)] ? [B2 (y)] : [B3 (z)]15// \ /16// ---|----17// V18// [B1] --> [B0 (EXIT)]19// return20 21// CHECK: [ B0 (live expressions at block exit) ]22// CHECK-EMPTY:23// CHECK-EMPTY:24// CHECK: [ B1 (live expressions at block exit) ]25// CHECK-EMPTY:26// CHECK-EMPTY:27// CHECK: [ B2 (live expressions at block exit) ]28// CHECK-EMPTY:29// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'30// CHECK-EMPTY:31// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'32// CHECK-EMPTY:33// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>34// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>35// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'36// CHECK-EMPTY:37// CHECK-EMPTY:38// CHECK: [ B3 (live expressions at block exit) ]39// CHECK-EMPTY:40// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'41// CHECK-EMPTY:42// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'43// CHECK-EMPTY:44// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>45// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>46// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'47// CHECK-EMPTY:48// CHECK-EMPTY:49// CHECK: [ B4 (live expressions at block exit) ]50// CHECK-EMPTY:51// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'52// CHECK-EMPTY:53// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'54// CHECK-EMPTY:55// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>56// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>57// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'58// CHECK-EMPTY:59// CHECK-EMPTY:60// CHECK: [ B5 (live expressions at block exit) ]61// CHECK-EMPTY:62// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'63// CHECK-EMPTY:64// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'65// CHECK-EMPTY:66// CHECK-EMPTY:67 68 69void testIfBranchExpression(bool flag) {70 // No expressions should be carried over from one block to another here.71 while (flag) {72 int e = 1;73 if (true)74 e;75 }76}77// CHECK: [ B0 (live expressions at block exit) ]78// CHECK-EMPTY:79// CHECK-EMPTY:80// CHECK: [ B1 (live expressions at block exit) ]81// CHECK-EMPTY:82// CHECK-EMPTY:83// CHECK: [ B2 (live expressions at block exit) ]84// CHECK-EMPTY:85// CHECK-EMPTY:86// CHECK: [ B3 (live expressions at block exit) ]87// CHECK-EMPTY:88// CHECK-EMPTY:89// CHECK: [ B4 (live expressions at block exit) ]90// CHECK-EMPTY:91// CHECK-EMPTY:92// CHECK: [ B5 (live expressions at block exit) ]93// CHECK-EMPTY:94// CHECK-EMPTY:95 96 97void testWhileBodyExpression(bool flag) {98 // No expressions should be carried over from one block to another here.99 while (flag) {100 int e = 1;101 while (coin())102 e;103 }104}105// CHECK: [ B0 (live expressions at block exit) ]106// CHECK-EMPTY:107// CHECK-EMPTY:108// CHECK: [ B1 (live expressions at block exit) ]109// CHECK-EMPTY:110// CHECK-EMPTY:111// CHECK: [ B2 (live expressions at block exit) ]112// CHECK-EMPTY:113// CHECK-EMPTY:114// CHECK: [ B3 (live expressions at block exit) ]115// CHECK-EMPTY:116// CHECK-EMPTY:117// CHECK: [ B4 (live expressions at block exit) ]118// CHECK-EMPTY:119// CHECK-EMPTY:120// CHECK: [ B5 (live expressions at block exit) ]121// CHECK-EMPTY:122// CHECK-EMPTY:123 124 125void testDoWhileBodyExpression(bool flag) {126 // No expressions should be carried over from one block to another here.127 while (flag) {128 int e = 1;129 do130 e;131 while (coin());132 }133}134// CHECK: [ B0 (live expressions at block exit) ]135// CHECK-EMPTY:136// CHECK-EMPTY:137// CHECK: [ B1 (live expressions at block exit) ]138// CHECK-EMPTY:139// CHECK-EMPTY:140// CHECK: [ B2 (live expressions at block exit) ]141// CHECK-EMPTY:142// CHECK-EMPTY:143// CHECK: [ B3 (live expressions at block exit) ]144// CHECK-EMPTY:145// CHECK-EMPTY:146// CHECK: [ B4 (live expressions at block exit) ]147// CHECK-EMPTY:148// CHECK-EMPTY:149// CHECK: [ B5 (live expressions at block exit) ]150// CHECK-EMPTY:151// CHECK-EMPTY:152 153 154void testForBodyExpression(bool flag) {155 // No expressions should be carried over from one block to another here.156 while (flag) {157 int e = 1;158 for (; coin();)159 e;160 }161}162// CHECK: [ B0 (live expressions at block exit) ]163// CHECK-EMPTY:164// CHECK-EMPTY:165// CHECK: [ B1 (live expressions at block exit) ]166// CHECK-EMPTY:167// CHECK-EMPTY:168// CHECK: [ B2 (live expressions at block exit) ]169// CHECK-EMPTY:170// CHECK-EMPTY:171// CHECK: [ B3 (live expressions at block exit) ]172// CHECK-EMPTY:173// CHECK-EMPTY:174// CHECK: [ B4 (live expressions at block exit) ]175// CHECK-EMPTY:176// CHECK-EMPTY:177// CHECK: [ B5 (live expressions at block exit) ]178// CHECK-EMPTY:179// CHECK-EMPTY:180 181void clang_analyzer_eval(bool);182 183void test_lambda_refcapture() {184 int a = 6;185 [&](int &a) { a = 42; }(a);186 clang_analyzer_eval(a == 42); // expected-warning{{TRUE}}187}188 189// CHECK: [ B0 (live expressions at block exit) ]190// CHECK-EMPTY:191// CHECK-EMPTY:192// CHECK-NEXT: [ B1 (live expressions at block exit) ]193// CHECK-EMPTY:194// CHECK-EMPTY:195// CHECK-NEXT: [ B2 (live expressions at block exit) ]196// CHECK-EMPTY:197// CHECK-EMPTY:198 199int logicalOpInTernary(bool b) {200 return (b || b) ? 0 : 1;201}202 203// [B6 (ENTRY)]204// |205// V206// [B5 (b || ...)]207// | \208// | |209// V V210// [B4 (b||b)] ? [B2 (0)] : [B3 (1)]211// \ /212// ---|----213// V214// [B1] --> [B0 (EXIT)]215// return216 217// CHECK: [ B0 (live expressions at block exit) ]218// CHECK-EMPTY:219// CHECK-EMPTY:220// CHECK: [ B1 (live expressions at block exit) ]221// CHECK-EMPTY:222// CHECK-EMPTY:223// CHECK: [ B2 (live expressions at block exit) ]224// CHECK-EMPTY:225// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>226// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'227// CHECK-EMPTY:228// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>229// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'230// CHECK-EMPTY:231// CHECK: BinaryOperator {{.*}} '_Bool' '||'232// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>233// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'234// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>235// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'236// CHECK-EMPTY:237// CHECK: IntegerLiteral {{.*}} 'int' 0238// CHECK-EMPTY:239// CHECK: IntegerLiteral {{.*}} 'int' 1240// CHECK-EMPTY:241// CHECK-EMPTY:242// CHECK: [ B3 (live expressions at block exit) ]243// CHECK-EMPTY:244// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>245// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'246// CHECK-EMPTY:247// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>248// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'249// CHECK-EMPTY:250// CHECK: BinaryOperator {{.*}} '_Bool' '||'251// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>252// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'253// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>254// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'255// CHECK-EMPTY:256// CHECK: IntegerLiteral {{.*}} 'int' 0257// CHECK-EMPTY:258// CHECK: IntegerLiteral {{.*}} 'int' 1259// CHECK-EMPTY:260// CHECK-EMPTY:261// CHECK: [ B4 (live expressions at block exit) ]262// CHECK-EMPTY:263// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>264// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'265// CHECK-EMPTY:266// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>267// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'268// CHECK-EMPTY:269// CHECK: BinaryOperator {{.*}} '_Bool' '||'270// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>271// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'272// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>273// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'274// CHECK-EMPTY:275// CHECK: IntegerLiteral {{.*}} 'int' 0276// CHECK-EMPTY:277// CHECK: IntegerLiteral {{.*}} 'int' 1278// CHECK-EMPTY:279// CHECK-EMPTY:280// CHECK: [ B5 (live expressions at block exit) ]281// CHECK-EMPTY:282// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>283// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'284// CHECK-EMPTY:285// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>286// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'287// CHECK-EMPTY:288// CHECK: BinaryOperator {{.*}} '_Bool' '||'289// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>290// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'291// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>292// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'293// CHECK-EMPTY:294// CHECK: IntegerLiteral {{.*}} 'int' 0295// CHECK-EMPTY:296// CHECK: IntegerLiteral {{.*}} 'int' 1297// CHECK-EMPTY:298// CHECK-EMPTY:299// CHECK: [ B6 (live expressions at block exit) ]300// CHECK-EMPTY:301// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>302// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'303// CHECK-EMPTY:304// CHECK: IntegerLiteral {{.*}} 'int' 0305// CHECK-EMPTY:306// CHECK: IntegerLiteral {{.*}} 'int' 1307