// RUN: llvm-tblgen %s | FileCheck %s // RUN: not llvm-tblgen -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s defvar claim = "This is the end of the world!"; // CHECK: def Rec1 // CHECK: fullNoLength = "This is the end of the world!"; // CHECK: fullLength = "This is the end of the world!"; // CHECK: thisIsTheEnd = "This is the end"; // CHECK: DoorsSong = "the end"; // CHECK: finalNoLength = "end of the world!"; // CHECK: finalLength = "end of the world!"; def Rec1 { string fullNoLength = !substr(claim, 0); string fullLength = !substr(claim, 0, 999); string thisIsTheEnd = !substr(claim, 0, 15); string DoorsSong = !substr(claim, 8, 7); string finalNoLength = !substr(claim, 12); string finalLength = !substr(claim, 12, !sub(!size(claim), 12)); } // CHECK: def Rec2 { // CHECK: lastName = "Flintstone"; def Rec2 { string firstName = "Fred"; string name = firstName # " " # "Flintstone"; string lastName = !substr(name, !add(!size(firstName), 1)); } // CHECK: def Rec3 { // CHECK: test1 = ""; // CHECK: test2 = ""; // CHECK: test3 = ""; // CHECK: test4 = "h"; // CHECK: test5 = "hello"; // CHECK: test6 = ""; def Rec3 { string test1 = !substr("", 0, 0); string test2 = !substr("", 0, 9); string test3 = !substr("hello", 0, 0); string test4 = !substr("hello", 0, 1); string test5 = !substr("hello", 0, 99); string test6 = !substr("hello", 5, 99); } // CHECK: def Rec4 // CHECK: message = "This is the end of the world!"; // CHECK: messagePrefix = "This is th..."; // CHECK: warning = "Bad message: 'This is th...'"; class C<string msg> { string message = msg; string messagePrefix = !substr(message, 0, 10) # "..."; } def Rec4 : C<claim> { string warning = "Bad message: '" # messagePrefix # "'"; } #ifdef ERROR1 // ERROR1: expected string, got type 'int' // ERROR1: expected int, got type 'bits<3>' // ERROR1: expected int, got type 'string' // ERROR1: !substr start position is out of range 0...29: 30 // ERROR1: !substr length must be nonnegative def Rec8 { string claim1 = !substr(42, 0, 3); string claim2 = !substr(claim, 0b101); string claim3 = !substr(claim, 0, "oops"); } def Rec9 { string claim1 = !substr(claim, !add(!size(claim), 1)); string claim2 = !substr(claim, 0, -13); } #endif