diff options
| -rw-r--r-- | llvm/lib/TableGen/TGParser.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/TableGen/foreach.td | 12 |
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]>; |

