|  | // RUN: llvm-tblgen %s | FileCheck %s | 
|  | // RUN: not llvm-tblgen -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s | 
|  | // RUN: not llvm-tblgen -DERROR2 %s 2>&1 | FileCheck --check-prefix=ERROR2 %s | 
|  |  | 
|  | // Test at top level. | 
|  |  | 
|  | // CHECK-NOT: def aNo | 
|  | // CHECK: def aYes | 
|  | if 0 then def aNo; | 
|  | if 1 then def aYes; | 
|  |  | 
|  | // Test inside a foreach, with condition based on the iteration variable. | 
|  |  | 
|  | // CHECK: def bNotThree1 | 
|  | // CHECK: def bNotThree2 | 
|  | // CHECK: def bNotThree4 | 
|  | // CHECK: def bThree3 | 
|  | foreach i = 1...4 in { | 
|  | if !eq(i, 3) then { | 
|  | def "bThree" # i; | 
|  | } else { | 
|  | def "bNotThree" # i; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Test inside a multiclass, with condition based on a multiclass parameter. | 
|  |  | 
|  | multiclass Multi<int i> { | 
|  | def Unconditional; | 
|  |  | 
|  | if !eq(i, 2) then | 
|  | def Cond; | 
|  |  | 
|  | if !ge(i, 3) then | 
|  | def ThenRec; | 
|  | else | 
|  | def ElseRec; | 
|  | } | 
|  |  | 
|  | // CHECK-NOT: def c1Cond | 
|  | // CHECK: def c1ElseRec | 
|  | // CHECK-NOT: def c1ThenRec | 
|  | // CHECK: def c1Unconditional | 
|  | defm c1: Multi<1>; | 
|  |  | 
|  | // CHECK: def c2Cond | 
|  | // CHECK: def c2ElseRec | 
|  | // CHECK-NOT: def c2ThenRec | 
|  | // CHECK: def c2Unconditional | 
|  | defm c2: Multi<2>; | 
|  |  | 
|  | // CHECK-NOT: def c3Cond | 
|  | // CHECK-NOT: def c3ElseRec | 
|  | // CHECK: def c3ThenRec | 
|  | // CHECK: def c3Unconditional | 
|  | defm c3: Multi<3>; | 
|  |  | 
|  | // Test resolution of the dangling-else ambiguity. | 
|  |  | 
|  | // CHECK: def dThenElse00 | 
|  | // CHECK-NOT: def dThenElse1 | 
|  | // CHECK-NOT: def dThenElse11 | 
|  | // CHECK: def dThenThen01 | 
|  | foreach i = 0...1 in | 
|  | foreach j = 0...1 in | 
|  | if !eq(i,0) then | 
|  | if !eq(j,1) then | 
|  | def "dThenThen"#i#j; | 
|  | else // binds to the inner if, not the outer one | 
|  | def "dThenElse"#i#j; | 
|  |  | 
|  | // Error tests: ensure you can't put an if inside a def or class. | 
|  |  | 
|  | #ifdef ERROR1 | 
|  | def baddef { | 
|  | int x = 3; | 
|  | // ERROR1: [[@LINE+1]]:3: error: Unknown token when expecting a type | 
|  | if 1 then { | 
|  | int y = 4; | 
|  | } | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifdef ERROR2 | 
|  | class badclass<int i> { | 
|  | int x = 3; | 
|  | // ERROR2: [[@LINE+1]]:3: error: Unknown token when expecting a type | 
|  | if !eq(i, 5) then { | 
|  | int y = 4; | 
|  | } | 
|  | } | 
|  | #endif |