From 869ea800defc2db6e4e9bd0cdda5f47f8dc2a866 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle <nhaehnle@gmail.com> Date: Thu, 22 Feb 2018 15:26:28 +0000 Subject: [PATCH] TableGen: Generalize type deduction for !listconcat Summary: This way, it should work even with complex operands. Change-Id: Iaccf5bbb50bd5882a0ba5d59689e4381315fb361 Reviewers: arsenm, craig.topper, tra, MartinO Subscribers: wdng, llvm-commits Differential Revision: https://reviews.llvm.org/D43554 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325796 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/TableGen/TGParser.cpp | 4 +--- test/TableGen/listconcat.td | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp index b6e207f7a74..12ae237c452 100644 --- a/lib/TableGen/TGParser.cpp +++ b/lib/TableGen/TGParser.cpp @@ -944,9 +944,7 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { // If we are doing !listconcat, we should know the type by now if (OpTok == tgtok::XListConcat) { - if (VarInit *Arg0 = dyn_cast<VarInit>(InitList[0])) - Type = Arg0->getType(); - else if (ListInit *Arg0 = dyn_cast<ListInit>(InitList[0])) + if (TypedInit *Arg0 = dyn_cast<TypedInit>(InitList[0])) Type = Arg0->getType(); else { InitList[0]->print(errs()); diff --git a/test/TableGen/listconcat.td b/test/TableGen/listconcat.td index 870e649d41d..26dce17e92d 100644 --- a/test/TableGen/listconcat.td +++ b/test/TableGen/listconcat.td @@ -1,18 +1,32 @@ // RUN: llvm-tblgen %s | FileCheck %s +// CHECK: class X<list<int> X:a = ?, list<int> X:b = ?, list<int> X:c = ?> { +// CHECK: list<int> x = !listconcat(!listconcat(X:a, X:b), !listconcat(X:b, X:c)); +// CHECK: } + // CHECK: class Y<list<string> Y:S = ?> { // CHECK: list<string> T1 = !listconcat(Y:S, ["foo"]); // CHECK: list<string> T2 = !listconcat(Y:S, !listconcat(["foo"], !listconcat(Y:S, ["bar", "baz"]))); // CHECK: } +// CHECK: def DX { +// CHECK: list<int> x = [0, 1, 1, 2] +// CHECK: } + // CHECK: def Z { // CHECK: list<string> T1 = ["fu", "foo"]; // CHECK: list<string> T2 = ["fu", "foo", "fu", "bar", "baz"]; // CHECK: } +class X<list<int> a, list<int> b, list<int> c> { + list<int> x = !listconcat(!listconcat(a, b), !listconcat(b, c)); +} + class Y<list<string> S> { list<string> T1 = !listconcat(S, ["foo"]); list<string> T2 = !listconcat(S, ["foo"], S, ["bar", "baz"]); } +def DX : X<[0], [1], [2]>; + def Z : Y<["fu"]>; -- GitLab