// 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