Index: llvm/trunk/lib/TableGen/Record.cpp =================================================================== --- llvm/trunk/lib/TableGen/Record.cpp +++ llvm/trunk/lib/TableGen/Record.cpp @@ -859,8 +859,13 @@ if (LHSs && RHSs) { DefInit *LOp = dyn_cast(LHSs->getOperator()); DefInit *ROp = dyn_cast(RHSs->getOperator()); - if (!LOp || !ROp || LOp->getDef() != ROp->getDef()) - PrintFatalError("Concated Dag operators do not match!"); + if (!LOp || !ROp) + break; + if (LOp->getDef() != ROp->getDef()) { + PrintFatalError(Twine("Concatenated Dag operators do not match: '") + + LHSs->getAsString() + "' vs. '" + RHSs->getAsString() + + "'"); + } SmallVector Args; SmallVector ArgNames; for (unsigned i = 0, e = LHSs->getNumArgs(); i != e; ++i) { Index: llvm/trunk/test/TableGen/dag-functional.td =================================================================== --- llvm/trunk/test/TableGen/dag-functional.td +++ llvm/trunk/test/TableGen/dag-functional.td @@ -40,7 +40,13 @@ // CHECK: dag d1 = (ops 1, ?:$name1, 2, 3); // CHECK: } -def ops; +// CHECK: def E0 { +// CHECK: dag ret = (ops 1, 2); +// CHECK: } + +class Ops; + +def ops : Ops; class Node { int Val = val; @@ -100,4 +106,11 @@ def D { dag d1 = !con((ops 1), (ops $name1), (ops), (ops 2, 3)); -} \ No newline at end of file +} + +class E { + // Allow concatenation of DAG nodes with operators from template arguments. + dag ret = !con((op 1), (op 2)); +} + +def E0 : E;