[llvm] r356985 - [TableGen] Give meaningful msg for def use in multiclass

Javed Absar via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 26 03:49:09 PDT 2019


Author: javed.absar
Date: Tue Mar 26 03:49:09 2019
New Revision: 356985

URL: http://llvm.org/viewvc/llvm-project?rev=356985&view=rev
Log:
[TableGen] Give meaningful msg for def use in multiclass

When one mistakenly specifies 'def' instead of using 'defm',
the error message is quite misleading: 'Couldn't find class..'
Instead, it should recommend using defm if the multiclass of
same name exists.

Reviewed By: hfinkel

Differential Revision: https://reviews.llvm.org/D59294 


Added:
    llvm/trunk/test/TableGen/MultiClass-def-fail.td
Modified:
    llvm/trunk/lib/TableGen/TGParser.cpp

Modified: llvm/trunk/lib/TableGen/TGParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.cpp?rev=356985&r1=356984&r2=356985&view=diff
==============================================================================
--- llvm/trunk/lib/TableGen/TGParser.cpp (original)
+++ llvm/trunk/lib/TableGen/TGParser.cpp Tue Mar 26 03:49:09 2019
@@ -536,8 +536,14 @@ Record *TGParser::ParseClassID() {
   }
 
   Record *Result = Records.getClass(Lex.getCurStrVal());
-  if (!Result)
-    TokError("Couldn't find class '" + Lex.getCurStrVal() + "'");
+  if (!Result) {
+    std::string Msg("Couldn't find class '" + Lex.getCurStrVal() + "'");
+    if (MultiClasses[Lex.getCurStrVal()].get())
+      TokError(Msg + ". Use 'defm' if you meant to use multiclass '" +
+               Lex.getCurStrVal() + "'");
+    else
+      TokError(Msg);
+  }
 
   Lex.Lex();
   return Result;

Added: llvm/trunk/test/TableGen/MultiClass-def-fail.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/MultiClass-def-fail.td?rev=356985&view=auto
==============================================================================
--- llvm/trunk/test/TableGen/MultiClass-def-fail.td (added)
+++ llvm/trunk/test/TableGen/MultiClass-def-fail.td Tue Mar 26 03:49:09 2019
@@ -0,0 +1,10 @@
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+// XFAIL: vg_leak
+
+// This test checks that using def instead of defm gives a meaningful error
+multiclass M2 {
+  def X;
+}
+
+// CHECK: error: Couldn't find class 'M2'. Use 'defm' if you meant to use multiclass 'M2'
+def rec1 : M2;




More information about the llvm-commits mailing list