summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/TableGen/TGParser.cpp8
-rw-r--r--llvm/test/TableGen/foreach.td12
2 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp
index 12ae237c452..17c2c2ee613 100644
--- a/llvm/lib/TableGen/TGParser.cpp
+++ b/llvm/lib/TableGen/TGParser.cpp
@@ -1075,6 +1075,14 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) {
return nullptr;
}
Type = MHSt->getType();
+ if (isa<ListRecTy>(Type)) {
+ TypedInit *RHSt = dyn_cast<TypedInit>(RHS);
+ if (!RHSt) {
+ TokError("could not get type of !foreach list elements");
+ return nullptr;
+ }
+ Type = RHSt->getType()->getListTy();
+ }
break;
}
case tgtok::XSubst: {
diff --git a/llvm/test/TableGen/foreach.td b/llvm/test/TableGen/foreach.td
index 541da49ccde..33b6eb5bfa8 100644
--- a/llvm/test/TableGen/foreach.td
+++ b/llvm/test/TableGen/foreach.td
@@ -7,12 +7,18 @@
// CHECK: "NAME"
// CHECK: Defs
+
+// CHECK: def DX {
+// CHECK: list<string> x = ["0", "1", "2"];
+// CHECK: }
+
// CHECK: Jr
// CHECK: Sr
// Variables for foreach
class decls {
string name;
+ int num;
}
def Decls : decls;
@@ -37,3 +43,9 @@ def Seniors : B<People.values>;
def Juniors : C<People.values>;
def Smiths : D<["NAME", "Jane Smith"]>;
def Unprocessed : D<People.values>;
+
+class X<list<int> a> {
+ list<string> x = !foreach(Decls.num, a, !cast<string>(Decls.num));
+}
+
+def DX : X<[0, 1, 2]>;
OpenPOWER on IntegriCloud