From: Javed Absar Date: Tue, 26 Mar 2019 10:49:09 +0000 (+0000) Subject: [TableGen] Give meaningful msg for def use in multiclass X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a995825115781637fd4d15b1a9f3f02c2efc3b1;p=llvm [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356985 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp index 90c9b390e10..3fc2e53f208 100644 --- a/lib/TableGen/TGParser.cpp +++ b/lib/TableGen/TGParser.cpp @@ -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; diff --git a/test/TableGen/MultiClass-def-fail.td b/test/TableGen/MultiClass-def-fail.td new file mode 100644 index 00000000000..ed37e5cd71c --- /dev/null +++ b/test/TableGen/MultiClass-def-fail.td @@ -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;