diff options
-rw-r--r-- | lib/VMCore/Verifier.cpp | 1 | ||||
-rw-r--r-- | lib/VMCore/iMemory.cpp | 10 |
2 files changed, 6 insertions, 5 deletions
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 145a66caf5..e156692ee8 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -23,7 +23,6 @@ // * All Instructions must be embeded into a basic block // . Function's cannot take a void typed parameter // * Verify that a function's argument list agrees with it's declared type. -// . Verify that arrays and structures have fixed elements: No unsized arrays. // * It is illegal to specify a name for a void value. // * It is illegal to have a internal global value with no intitalizer // * It is illegal to have a ret instruction that returns a value that does not diff --git a/lib/VMCore/iMemory.cpp b/lib/VMCore/iMemory.cpp index dacb8fe2a2..db9b9617a2 100644 --- a/lib/VMCore/iMemory.cpp +++ b/lib/VMCore/iMemory.cpp @@ -116,16 +116,18 @@ const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, // Handle the special case of the empty set index set... if (Idx.empty()) return cast<PointerType>(Ptr)->getElementType(); - unsigned CurIDX = 0; + unsigned CurIdx = 0; while (const CompositeType *CT = dyn_cast<CompositeType>(Ptr)) { - if (Idx.size() == CurIDX) { + if (Idx.size() == CurIdx) { if (AllowCompositeLeaf || CT->isFirstClassType()) return Ptr; return 0; // Can't load a whole structure or array!?!? } - Value *Index = Idx[CurIDX++]; + Value *Index = Idx[CurIdx++]; + if (isa<PointerType>(CT) && CurIdx != 1) + return 0; // Can only index into pointer types at the first index! if (!CT->indexValid(Index)) return 0; Ptr = CT->getTypeAtIndex(Index); } - return CurIDX == Idx.size() ? Ptr : 0; + return CurIdx == Idx.size() ? Ptr : 0; } |