[llvm] 9346acd - [TableGen] Add submulticlass typechecking to template arg values (#197128)

via llvm-commits llvm-commits at lists.llvm.org
Tue May 12 03:04:00 PDT 2026


Author: jofrn
Date: 2026-05-12T03:03:54-07:00
New Revision: 9346acd7806aee8a675089d5b5bcbd8ce98147e0

URL: https://github.com/llvm/llvm-project/commit/9346acd7806aee8a675089d5b5bcbd8ce98147e0
DIFF: https://github.com/llvm/llvm-project/commit/9346acd7806aee8a675089d5b5bcbd8ce98147e0.diff

LOG: [TableGen] Add submulticlass typechecking to template arg values (#197128)

Some typechecking was missing when parsing a submulticlass reference.
Add the CheckTemplateArgValues call in ParseSubMultiClassReference.

Resolves https://github.com/llvm/llvm-project/issues/84910.

Added: 
    llvm/test/TableGen/submulticlass-leteq.td
    llvm/test/TableGen/submulticlass-typecheck.td

Modified: 
    llvm/lib/TableGen/TGParser.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp
index 25405eef60366..c44e067a9da9f 100644
--- a/llvm/lib/TableGen/TGParser.cpp
+++ b/llvm/lib/TableGen/TGParser.cpp
@@ -863,6 +863,11 @@ TGParser::ParseSubMultiClassReference(MultiClass *CurMC) {
     return Result;
   }
 
+  if (CheckTemplateArgValues(Result.TemplateArgs, ArgLocs, &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<bits<8> Val> {
+  let x = !eq(Val, !cast<bits<8>>(-1)) in def NAME : C;
+}
+multiclass M1<bits<8> 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..2abc892a7a211
--- /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:30: error: Value specified for template argument 'B::op' is of type bits<4>; expected type bits<8>: C::op
+// CHECK-NEXT: multiclass C<bits<4> op> : B<op>;
+class A<bits<8> op> {
+  bits<8> f = op;
+}
+multiclass B<bits<8> op> {
+  def : A<op>;
+}
+multiclass C<bits<4> op> : B<op>;
+defm D : C<0>;


        


More information about the llvm-commits mailing list