| // RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-loopexit=true %s > %t 2>&1 | 
 | // RUN: FileCheck --input-file=%t %s | 
 |  | 
 | // CHECK:       [B6 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B5 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: ForStmt (LoopExit) | 
 | // CHECK-NEXT:   2: return; | 
 | // CHECK-NEXT:   Preds (1): B4 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B2.1]++ | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B4 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B3.1]++ | 
 | // CHECK-NEXT:   Preds (1): B4 | 
 | // CHECK-NEXT:   Succs (1): B2 | 
 |  | 
 | // CHECK:       [B4] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 12 | 
 | // CHECK-NEXT:   4: [B4.2] < [B4.3] | 
 | // CHECK-NEXT:   T: for (...; [B4.4]; ...) | 
 | // CHECK-NEXT:   Preds (2): B2 B5 | 
 | // CHECK-NEXT:   Succs (2): B3 B1 | 
 |  | 
 | // CHECK:       [B5] | 
 | // CHECK-NEXT:   1: 0 | 
 | // CHECK-NEXT:   2: int i = 0; | 
 | // CHECK-NEXT:   Preds (1): B6 | 
 | // CHECK-NEXT:   Succs (1): B4 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_forloop1() { | 
 |   for (int i = 0; i < 12; i++) { | 
 |     i++; | 
 |   } | 
 |   return; | 
 | } | 
 |  | 
 | // CHECK:       [B4 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: ForStmt (LoopExit) | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   T: for (; ; ) | 
 | // CHECK-NEXT:   Preds (2): B2 B4 | 
 | // CHECK-NEXT:   Succs (2): B2 NULL | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_forloop2() { | 
 |   for (;;) | 
 |     ; | 
 | } | 
 |  | 
 | // CHECK:       [B5 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B4 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: WhileStmt (LoopExit) | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B4 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   1: int i; | 
 | // CHECK-NEXT:   Preds (1): B4 | 
 | // CHECK-NEXT:   Succs (1): B2 | 
 |  | 
 | // CHECK:       [B4] | 
 | // CHECK-NEXT:   1: true | 
 | // CHECK-NEXT:   T: while [B4.1] | 
 | // CHECK-NEXT:   Preds (2): B2 B5 | 
 | // CHECK-NEXT:   Succs (2): B3 NULL | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_while1() { | 
 |   while (true) { | 
 |     int i; | 
 |   } | 
 | } | 
 |  | 
 | // CHECK:       [B5 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B4 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: WhileStmt (LoopExit) | 
 | // CHECK-NEXT:   2: 2 | 
 | // CHECK-NEXT:   3: int k = 2; | 
 | // CHECK-NEXT:   4: return; | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   1: l | 
 | // CHECK-NEXT:   2: [B3.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 42 | 
 | // CHECK-NEXT:   4: [B3.2] < [B3.3] | 
 | // CHECK-NEXT:   T: while [B3.4] | 
 | // CHECK-NEXT:   Preds (2): B2 B4 | 
 | // CHECK-NEXT:   Succs (2): B2 B1 | 
 |  | 
 | // CHECK:       [B4] | 
 | // CHECK-NEXT:   1: int l; | 
 | // CHECK-NEXT:   Preds (1): B5 | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_while2() { | 
 |   int l; | 
 |   while (l < 42) | 
 |     ; | 
 |   int k = 2; | 
 |   return; | 
 | } | 
 |  | 
 | // CHECK:       [B4 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: WhileStmt (LoopExit) | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   1: false | 
 | // CHECK-NEXT:   T: while [B3.1] | 
 | // CHECK-NEXT:   Preds (2): B2 B4 | 
 | // CHECK-NEXT:   Succs (2): NULL B1 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_while3() { | 
 |   while (false) { | 
 |     ; | 
 |   } | 
 | } | 
 |  | 
 | // CHECK:       [B4 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B2 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: DoStmt (LoopExit) | 
 | // CHECK-NEXT:   Preds (1): B2 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   1: false | 
 | // CHECK-NEXT:   T: do ... while [B2.1] | 
 | // CHECK-NEXT:   Preds (2): B3 B4 | 
 | // CHECK-NEXT:   Succs (2): NULL B1 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   Succs (1): B2 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_dowhile1() { | 
 |   do { | 
 |   } while (false); | 
 | } | 
 |  | 
 | // CHECK:       [B6 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B5 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: DoStmt (LoopExit) | 
 | // CHECK-NEXT:   2: j | 
 | // CHECK-NEXT:   3: [B1.2]-- | 
 | // CHECK-NEXT:   4: return; | 
 | // CHECK-NEXT:   Preds (1): B2 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   1: j | 
 | // CHECK-NEXT:   2: [B2.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 20 | 
 | // CHECK-NEXT:   4: [B2.2] < [B2.3] | 
 | // CHECK-NEXT:   T: do ... while [B2.4] | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (2): B4 B1 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   1: j | 
 | // CHECK-NEXT:   2: 2 | 
 | // CHECK-NEXT:   3: [B3.1] += [B3.2] | 
 | // CHECK-NEXT:   Preds (2): B4 B5 | 
 | // CHECK-NEXT:   Succs (1): B2 | 
 |  | 
 | // CHECK:       [B4] | 
 | // CHECK-NEXT:   Preds (1): B2 | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B5] | 
 | // CHECK-NEXT:   1: 2 | 
 | // CHECK-NEXT:   2: int j = 2; | 
 | // CHECK-NEXT:   Preds (1): B6 | 
 | // CHECK-NEXT:   Succs (1): B3 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_dowhile2() { | 
 |   int j = 2; | 
 |   do { | 
 |     j += 2; | 
 |   } while (j < 20); | 
 |   j--; | 
 |   return; | 
 | } | 
 |  | 
 | // CHECK:       [B10 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B9 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: WhileStmt (LoopExit) | 
 | // CHECK-NEXT:   Preds (1): B8 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B8 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   1: ForStmt (LoopExit) | 
 | // CHECK-NEXT:   Preds (1): B6 | 
 | // CHECK-NEXT:   Succs (1): B2 | 
 |  | 
 | // CHECK:       [B4] | 
 | // CHECK-NEXT:   1: j | 
 | // CHECK-NEXT:   2: [B4.1]++ | 
 | // CHECK-NEXT:   Preds (1): B5 | 
 | // CHECK-NEXT:   Succs (1): B6 | 
 |  | 
 | // CHECK:       [B5] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B5.1]++ | 
 | // CHECK-NEXT:   Preds (1): B6 | 
 | // CHECK-NEXT:   Succs (1): B4 | 
 |  | 
 | // CHECK:       [B6] | 
 | // CHECK-NEXT:   1: j | 
 | // CHECK-NEXT:   2: [B6.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 6 | 
 | // CHECK-NEXT:   4: [B6.2] < [B6.3] | 
 | // CHECK-NEXT:   T: for (...; [B6.4]; ...) | 
 | // CHECK-NEXT:   Preds (2): B4 B7 | 
 | // CHECK-NEXT:   Succs (2): B5 B3 | 
 |  | 
 | // CHECK:       [B7] | 
 | // CHECK-NEXT:   1: 1 | 
 | // CHECK-NEXT:   2: int j = 1; | 
 | // CHECK-NEXT:   Preds (1): B8 | 
 | // CHECK-NEXT:   Succs (1): B6 | 
 |  | 
 | // CHECK:       [B8] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B8.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 2 | 
 | // CHECK-NEXT:   4: [B8.2] < [B8.3] | 
 | // CHECK-NEXT:   T: while [B8.4] | 
 | // CHECK-NEXT:   Preds (2): B2 B9 | 
 | // CHECK-NEXT:   Succs (2): B7 B1 | 
 |  | 
 | // CHECK:       [B9] | 
 | // CHECK-NEXT:   1: 40 | 
 | // CHECK-NEXT:   2: -[B9.1] | 
 | // CHECK-NEXT:   3: int i = -40; | 
 | // CHECK-NEXT:   Preds (1): B10 | 
 | // CHECK-NEXT:   Succs (1): B8 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void nested_loops1() { | 
 |   int i = -40; | 
 |   while (i < 2) { | 
 |     for (int j = 1; j < 6; j++) | 
 |       i++; | 
 |   } | 
 | } | 
 |  | 
 | // CHECK:       [B9 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B8 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: ForStmt (LoopExit) | 
 | // CHECK-NEXT:   Preds (1): B7 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   1: j | 
 | // CHECK-NEXT:   2: [B2.1]++ | 
 | // CHECK-NEXT:   Preds (1): B3 | 
 | // CHECK-NEXT:   Succs (1): B7 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   1: DoStmt (LoopExit) | 
 | // CHECK-NEXT:   2: i | 
 | // CHECK-NEXT:   3: [B3.2]-- | 
 | // CHECK-NEXT:   Preds (1): B4 | 
 | // CHECK-NEXT:   Succs (1): B2 | 
 |  | 
 | // CHECK:       [B4] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 2 | 
 | // CHECK-NEXT:   4: [B4.2] < [B4.3] | 
 | // CHECK-NEXT:   T: do ... while [B4.4] | 
 | // CHECK-NEXT:   Preds (1): B5 | 
 | // CHECK-NEXT:   Succs (2): B6 B3 | 
 |  | 
 | // CHECK:       [B5] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B5.1]++ | 
 | // CHECK-NEXT:   Preds (2): B6 B7 | 
 | // CHECK-NEXT:   Succs (1): B4 | 
 |  | 
 | // CHECK:       [B6] | 
 | // CHECK-NEXT:   Preds (1): B4 | 
 | // CHECK-NEXT:   Succs (1): B5 | 
 |  | 
 | // CHECK:       [B7] | 
 | // CHECK-NEXT:   1: j | 
 | // CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 6 | 
 | // CHECK-NEXT:   4: [B7.2] < [B7.3] | 
 | // CHECK-NEXT:   T: for (...; [B7.4]; ...) | 
 | // CHECK-NEXT:   Preds (2): B2 B8 | 
 | // CHECK-NEXT:   Succs (2): B5 B1 | 
 |  | 
 | // CHECK:       [B8] | 
 | // CHECK-NEXT:   1: 40 | 
 | // CHECK-NEXT:   2: -[B8.1] | 
 | // CHECK-NEXT:   3: int i = -40; | 
 | // CHECK-NEXT:   4: 1 | 
 | // CHECK-NEXT:   5: int j = 1; | 
 | // CHECK-NEXT:   Preds (1): B9 | 
 | // CHECK-NEXT:   Succs (1): B7 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void nested_loops2() { | 
 |   int i = -40; | 
 |   for (int j = 1; j < 6; j++) { | 
 |     do { | 
 |       i++; | 
 |     } while (i < 2); | 
 |     i--; | 
 |   } | 
 | } | 
 |  | 
 | // CHECK:       [B12 (ENTRY)] | 
 | // CHECK-NEXT:   Succs (1): B11 | 
 |  | 
 | // CHECK:       [B1] | 
 | // CHECK-NEXT:   1: WhileStmt (LoopExit) | 
 | // CHECK-NEXT:   2: return; | 
 | // CHECK-NEXT:   Preds (2): B3 B5 | 
 | // CHECK-NEXT:   Succs (1): B0 | 
 |  | 
 | // CHECK:       [B2] | 
 | // CHECK-NEXT:   Preds (1): B4 | 
 | // CHECK-NEXT:   Succs (1): B5 | 
 |  | 
 | // CHECK:       [B3] | 
 | // CHECK-NEXT:   T: break; | 
 | // CHECK-NEXT:   Preds (1): B4 | 
 | // CHECK-NEXT:   Succs (1): B1 | 
 |  | 
 | // CHECK:       [B4] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B4.1]++ | 
 | // CHECK-NEXT:   3: i | 
 | // CHECK-NEXT:   4: [B4.3] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   5: 2 | 
 | // CHECK-NEXT:   6: [B4.4] % [B4.5] | 
 | // CHECK-NEXT:   7: [B4.6] (ImplicitCastExpr, IntegralToBoolean, _Bool) | 
 | // CHECK-NEXT:   T: if [B4.7] | 
 | // CHECK-NEXT:   Preds (1): B5 | 
 | // CHECK-NEXT:   Succs (2): B3 B2 | 
 |  | 
 | // CHECK:       [B5] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 5 | 
 | // CHECK-NEXT:   4: [B5.2] < [B5.3] | 
 | // CHECK-NEXT:   T: while [B5.4] | 
 | // CHECK-NEXT:   Preds (2): B2 B6 | 
 | // CHECK-NEXT:   Succs (2): B4 B1 | 
 |  | 
 | // CHECK:       [B6] | 
 | // CHECK-NEXT:   1: ForStmt (LoopExit) | 
 | // CHECK-NEXT:   2: 1 | 
 | // CHECK-NEXT:   3: int i = 1; | 
 | // CHECK-NEXT:   Preds (2): B8 B10 | 
 | // CHECK-NEXT:   Succs (1): B5 | 
 |  | 
 | // CHECK:       [B7] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B7.1]++ | 
 | // CHECK-NEXT:   Preds (1): B9 | 
 | // CHECK-NEXT:   Succs (1): B10 | 
 |  | 
 | // CHECK:       [B8] | 
 | // CHECK-NEXT:   T: break; | 
 | // CHECK-NEXT:   Preds (1): B9 | 
 | // CHECK-NEXT:   Succs (1): B6 | 
 |  | 
 | // CHECK:       [B9] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B9.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 4 | 
 | // CHECK-NEXT:   4: [B9.2] == [B9.3] | 
 | // CHECK-NEXT:   T: if [B9.4] | 
 | // CHECK-NEXT:   Preds (1): B10 | 
 | // CHECK-NEXT:   Succs (2): B8 B7 | 
 |  | 
 | // CHECK:       [B10] | 
 | // CHECK-NEXT:   1: i | 
 | // CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, LValueToRValue, int) | 
 | // CHECK-NEXT:   3: 6 | 
 | // CHECK-NEXT:   4: [B10.2] < [B10.3] | 
 | // CHECK-NEXT:   T: for (...; [B10.4]; ...) | 
 | // CHECK-NEXT:   Preds (2): B7 B11 | 
 | // CHECK-NEXT:   Succs (2): B9 B6 | 
 |  | 
 | // CHECK:       [B11] | 
 | // CHECK-NEXT:   1: 2 | 
 | // CHECK-NEXT:   2: int i = 2; | 
 | // CHECK-NEXT:   Preds (1): B12 | 
 | // CHECK-NEXT:   Succs (1): B10 | 
 |  | 
 | // CHECK:       [B0 (EXIT)] | 
 | // CHECK-NEXT:   Preds (1): B1 | 
 | void check_break() | 
 | { | 
 |   for(int i = 2; i < 6; i++) { | 
 |     if(i == 4) | 
 |       break; | 
 |   } | 
 |  | 
 |   int i = 1; | 
 |   while(i<5){ | 
 |     i++; | 
 |     if(i%2) | 
 |       break; | 
 |   } | 
 |    | 
 |   return; | 
 | } |