1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00

Fix error in tablegen when either operand of !if is an empty list.

!if([Something], []) would error with "No type for list".

llvm-svn: 210572
This commit is contained in:
Matt Arsenault 2014-06-10 20:10:08 +00:00
parent 56f9d2e5d3
commit a3dd1c8170
3 changed files with 16 additions and 7 deletions

View File

@ -787,7 +787,7 @@ Init *TGParser::ParseIDValue(Record *CurRec,
/// ///
/// Operation ::= XOperator ['<' Type '>'] '(' Args ')' /// Operation ::= XOperator ['<' Type '>'] '(' Args ')'
/// ///
Init *TGParser::ParseOperation(Record *CurRec) { Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) {
switch (Lex.getCode()) { switch (Lex.getCode()) {
default: default:
TokError("unknown operation"); TokError("unknown operation");
@ -1026,8 +1026,9 @@ Init *TGParser::ParseOperation(Record *CurRec) {
} }
Lex.Lex(); // eat the ',' Lex.Lex(); // eat the ','
Init *MHS = ParseValue(CurRec); Init *MHS = ParseValue(CurRec, ItemType);
if (!MHS) return nullptr; if (!MHS)
return nullptr;
if (Lex.getCode() != tgtok::comma) { if (Lex.getCode() != tgtok::comma) {
TokError("expected ',' in ternary operator"); TokError("expected ',' in ternary operator");
@ -1035,8 +1036,9 @@ Init *TGParser::ParseOperation(Record *CurRec) {
} }
Lex.Lex(); // eat the ',' Lex.Lex(); // eat the ','
Init *RHS = ParseValue(CurRec); Init *RHS = ParseValue(CurRec, ItemType);
if (!RHS) return nullptr; if (!RHS)
return nullptr;
if (Lex.getCode() != tgtok::r_paren) { if (Lex.getCode() != tgtok::r_paren) {
TokError("expected ')' in binary operator"); TokError("expected ')' in binary operator");
@ -1446,7 +1448,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType,
case tgtok::XIf: case tgtok::XIf:
case tgtok::XForEach: case tgtok::XForEach:
case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')'
return ParseOperation(CurRec); return ParseOperation(CurRec, ItemType);
} }
} }

View File

@ -181,7 +181,7 @@ private: // Parser methods.
std::vector<unsigned> ParseRangeList(); std::vector<unsigned> ParseRangeList();
bool ParseRangePiece(std::vector<unsigned> &Ranges); bool ParseRangePiece(std::vector<unsigned> &Ranges);
RecTy *ParseType(); RecTy *ParseType();
Init *ParseOperation(Record *CurRec); Init *ParseOperation(Record *CurRec, RecTy *ItemType);
RecTy *ParseOperatorType(); RecTy *ParseOperatorType();
Init *ParseObjectName(MultiClass *CurMultiClass); Init *ParseObjectName(MultiClass *CurMultiClass);
Record *ParseClassID(); Record *ParseClassID();

View File

@ -0,0 +1,7 @@
// RUN: llvm-tblgen %s
// XFAIL: vg_leak
class C<bit cond> {
list<int> X = !if(cond, [1, 2, 3], []);
list<int> Y = !if(cond, [], [4, 5, 6]);
}