diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-01-05 08:18:44 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-01-05 08:18:44 +0000 |
| commit | b55ab54b7749c7ac236b46bd17ea4a31b4127023 (patch) | |
| tree | e00f6aebb078d9b0144d07679dc22c91e61080c8 /llvm | |
| parent | 4b6a0cce5e6f9a989f43ad4407cd98c01e89c335 (diff) | |
| download | bcm5719-llvm-b55ab54b7749c7ac236b46bd17ea4a31b4127023.tar.gz bcm5719-llvm-b55ab54b7749c7ac236b46bd17ea4a31b4127023.zip | |
reject PR3281:crash07.ll with:
llvm-as: crash07.ll:2:32: va_arg requires operand with first class type
%y = va_arg [52 x <{}>] %43, double (...) sspreq
^
llvm-svn: 61683
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.h | 2 |
2 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index bdb94530706..93dbcd8c163 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -2311,7 +2311,7 @@ bool LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB, case lltok::kw_ptrtoint: return ParseCast(Inst, PFS, Lex.getUIntVal()); // Other. case lltok::kw_select: return ParseSelect(Inst, PFS); - case lltok::kw_va_arg: return ParseVAArg(Inst, PFS); + case lltok::kw_va_arg: return ParseVA_Arg(Inst, PFS); case lltok::kw_extractelement: return ParseExtractElement(Inst, PFS); case lltok::kw_insertelement: return ParseInsertElement(Inst, PFS); case lltok::kw_shufflevector: return ParseShuffleVector(Inst, PFS); @@ -2735,15 +2735,19 @@ bool LLParser::ParseSelect(Instruction *&Inst, PerFunctionState &PFS) { return false; } -/// ParseVAArg -/// ::= 'vaarg' TypeAndValue ',' Type -bool LLParser::ParseVAArg(Instruction *&Inst, PerFunctionState &PFS) { +/// ParseVA_Arg +/// ::= 'va_arg' TypeAndValue ',' Type +bool LLParser::ParseVA_Arg(Instruction *&Inst, PerFunctionState &PFS) { Value *Op; PATypeHolder EltTy(Type::VoidTy); + LocTy TypeLoc; if (ParseTypeAndValue(Op, PFS) || ParseToken(lltok::comma, "expected ',' after vaarg operand") || - ParseType(EltTy)) + ParseType(EltTy, TypeLoc)) return true; + + if (!EltTy->isFirstClassType()) + return Error(TypeLoc, "va_arg requires operand with first class type"); Inst = new VAArgInst(Op, EltTy); return false; diff --git a/llvm/lib/AsmParser/LLParser.h b/llvm/lib/AsmParser/LLParser.h index e064c686b34..2ac92600a2d 100644 --- a/llvm/lib/AsmParser/LLParser.h +++ b/llvm/lib/AsmParser/LLParser.h @@ -252,7 +252,7 @@ namespace llvm { bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc); bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc); bool ParseSelect(Instruction *&I, PerFunctionState &PFS); - bool ParseVAArg(Instruction *&I, PerFunctionState &PFS); + bool ParseVA_Arg(Instruction *&I, PerFunctionState &PFS); bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS); bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS); bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS); |

