diff options
author | Eli Bendersky <eliben@google.com> | 2013-04-22 17:03:42 +0000 |
---|---|---|
committer | Eli Bendersky <eliben@google.com> | 2013-04-22 17:03:42 +0000 |
commit | 59eb5eeca7e49389ddde546e6b6ebba945b3dfc4 (patch) | |
tree | 6b33cd654f50df7936219544c4c7d8dbeb9aa867 /lib/AsmParser | |
parent | 44021515d76ec9b529f2adbc252552869b1357d5 (diff) | |
download | external_llvm-59eb5eeca7e49389ddde546e6b6ebba945b3dfc4.zip external_llvm-59eb5eeca7e49389ddde546e6b6ebba945b3dfc4.tar.gz external_llvm-59eb5eeca7e49389ddde546e6b6ebba945b3dfc4.tar.bz2 |
Fix for PR 14965: Better error message for GEP with partially defined contents
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180030 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser')
-rw-r--r-- | lib/AsmParser/LLParser.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index cdacce1..998bca5 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -4263,7 +4263,9 @@ int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) { if (ParseTypeAndValue(Ptr, Loc, PFS)) return true; - if (!Ptr->getType()->getScalarType()->isPointerTy()) + Type *BaseType = Ptr->getType(); + PointerType *BasePointerType = dyn_cast<PointerType>(BaseType->getScalarType()); + if (!BasePointerType) return Error(Loc, "base of getelementptr must be a pointer"); SmallVector<Value*, 16> Indices; @@ -4288,7 +4290,10 @@ int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) { Indices.push_back(Val); } - if (!GetElementPtrInst::getIndexedType(Ptr->getType(), Indices)) + if (!Indices.empty() && !BasePointerType->getElementType()->isSized()) + return Error(Loc, "base element of getelementptr must be sized"); + + if (!GetElementPtrInst::getIndexedType(BaseType, Indices)) return Error(Loc, "invalid getelementptr indices"); Inst = GetElementPtrInst::Create(Ptr, Indices); if (InBounds) |