text: // 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;
  }
  