diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp --- a/llvm/lib/TableGen/TGParser.cpp +++ b/llvm/lib/TableGen/TGParser.cpp @@ -2203,6 +2203,8 @@ break; default: Init *RHSResult = ParseValue(CurRec, ItemType, ParseNameMode); + if (!RHSResult) + return nullptr; Result = BinOpInit::getListConcat(LHS, RHSResult); } break; @@ -2239,6 +2241,8 @@ default: Init *RHSResult = ParseValue(CurRec, nullptr, ParseNameMode); + if (!RHSResult) + return nullptr; RHS = dyn_cast(RHSResult); if (!RHS) { Error(PasteLoc, "RHS of paste is not typed!"); diff --git a/llvm/test/TableGen/paste-reserved.td b/llvm/test/TableGen/paste-reserved.td new file mode 100644 --- /dev/null +++ b/llvm/test/TableGen/paste-reserved.td @@ -0,0 +1,22 @@ +// RUN: not llvm-tblgen -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s +// RUN: not llvm-tblgen -DERROR2 %s 2>&1 | FileCheck --check-prefix=ERROR2 %s + +defvar list1 = ["foo", "bar", "snork"]; + +// Pasting a list with a reserved word should produce an error. + +#ifdef ERROR1 +def list_paste { + list the_list = list1 # in; +} +// ERROR1: error: Unknown token when parsing a value +#endif + + +// Pasting an identifier with a reserved word should produce an error. + +#ifdef ERROR2 +def name_paste#in { +} +// ERROR2: error: Unknown token when parsing a value +#endif