brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.0 KiB · ca2ff6d Raw
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