reject PR3281:crash07.ll with:
authorChris Lattner <sabre@nondot.org>
Mon, 5 Jan 2009 08:18:44 +0000 (08:18 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 5 Jan 2009 08:18:44 +0000 (08:18 +0000)
llvm-as: crash07.ll:2:32: va_arg requires operand with first class type
  %y = va_arg [52 x <{}>] %43, double (...) sspreq
                               ^

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61683 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/LLParser.cpp
lib/AsmParser/LLParser.h

index bdb94530706c13f6e892696151ff694872f58c1d..93dbcd8c1632fca5d5a29a4219582fa38d23b201 100644 (file)
@@ -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;
index e064c686b34b34be6056595ec3e790455792a5f4..2ac92600a2d53c2796d3b69993ac309cec9a383c 100644 (file)
@@ -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);