Index: llvm/trunk/lib/TableGen/TGParser.cpp =================================================================== --- llvm/trunk/lib/TableGen/TGParser.cpp +++ llvm/trunk/lib/TableGen/TGParser.cpp @@ -944,9 +944,7 @@ // If we are doing !listconcat, we should know the type by now if (OpTok == tgtok::XListConcat) { - if (VarInit *Arg0 = dyn_cast(InitList[0])) - Type = Arg0->getType(); - else if (ListInit *Arg0 = dyn_cast(InitList[0])) + if (TypedInit *Arg0 = dyn_cast(InitList[0])) Type = Arg0->getType(); else { InitList[0]->print(errs()); Index: llvm/trunk/test/TableGen/listconcat.td =================================================================== --- llvm/trunk/test/TableGen/listconcat.td +++ llvm/trunk/test/TableGen/listconcat.td @@ -1,18 +1,32 @@ // RUN: llvm-tblgen %s | FileCheck %s +// CHECK: class X X:a = ?, list X:b = ?, list X:c = ?> { +// CHECK: list x = !listconcat(!listconcat(X:a, X:b), !listconcat(X:b, X:c)); +// CHECK: } + // CHECK: class Y Y:S = ?> { // CHECK: list T1 = !listconcat(Y:S, ["foo"]); // CHECK: list T2 = !listconcat(Y:S, !listconcat(["foo"], !listconcat(Y:S, ["bar", "baz"]))); // CHECK: } +// CHECK: def DX { +// CHECK: list x = [0, 1, 1, 2] +// CHECK: } + // CHECK: def Z { // CHECK: list T1 = ["fu", "foo"]; // CHECK: list T2 = ["fu", "foo", "fu", "bar", "baz"]; // CHECK: } +class X a, list b, list c> { + list x = !listconcat(!listconcat(a, b), !listconcat(b, c)); +} + class Y S> { list T1 = !listconcat(S, ["foo"]); list T2 = !listconcat(S, ["foo"], S, ["bar", "baz"]); } +def DX : X<[0], [1], [2]>; + def Z : Y<["fu"]>;