diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp index f315557f38aad..cffd40115168e 100644 --- a/llvm/lib/TableGen/TGParser.cpp +++ b/llvm/lib/TableGen/TGParser.cpp @@ -818,6 +818,12 @@ ParseSubMultiClassReference(MultiClass *CurMC) { return Result; } + if (CheckTemplateArgValues(Result.TemplateArgs, Result.RefRange.Start, + &Result.MC->Rec)) { + Result.MC = nullptr; // Error checking value list. + return Result; + } + Result.RefRange.End = Lex.getLoc(); return Result; diff --git a/llvm/test/TableGen/submulticlass-leteq.td b/llvm/test/TableGen/submulticlass-leteq.td new file mode 100644 index 0000000000000..eeaa523d870ec --- /dev/null +++ b/llvm/test/TableGen/submulticlass-leteq.td @@ -0,0 +1,21 @@ +// RUN: llvm-tblgen %s | FileCheck %s +// XFAIL: vg_leak +// CHECK: def X0 { // C +// CHECK-NEXT: bit x = 1; +// CHECK-NEXT: } +// CHECK-NEXT: def X1 { // C +// CHECK-NEXT: bit x = 0; +// CHECK-NEXT: } +class C { + bit x; +} +multiclass M0 Val> { + let x = !eq(Val, !cast>(-1)) in def NAME : C; +} +multiclass M1 Val> { + let x = !eq(Val, -1) in def NAME : C; +} +multiclass M2_0 : M0<-1>; +multiclass M2_1 : M1<-1>; +defm X0 : M2_0; +defm X1 : M2_1; diff --git a/llvm/test/TableGen/submulticlass-typecheck.td b/llvm/test/TableGen/submulticlass-typecheck.td new file mode 100644 index 0000000000000..b128d93e7b238 --- /dev/null +++ b/llvm/test/TableGen/submulticlass-typecheck.td @@ -0,0 +1,12 @@ +// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s +// XFAIL: vg_leak +// CHECK: {{.*}}:11:28: error: Value specified for template argument 'B::op' is of type bits<4>; expected type bits<8>: C::op +// CHECK-NEXT: multiclass C op> : B; +class A op> { + bits<8> f = op; +} +multiclass B op> { + def : A; +} +multiclass C op> : B; +defm D : C<0>;