Fix assert assembling zero-argument constant GEP.
authorEli Friedman <eli.friedman@gmail.com>
Fri, 24 Jul 2009 21:56:17 +0000 (21:56 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 24 Jul 2009 21:56:17 +0000 (21:56 +0000)
There's still a strict-aliasing violation here, but I don't feel like
dealing with that right now...

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

lib/AsmParser/LLParser.cpp
test/Assembler/2009-07-24-ZeroArgGEP.ll [new file with mode: 0644]

index 94224a6361c03a37a3bd46de80fc02e84d00c7ee..45e70c8f9c85cce509be4791e0341954eda52f68 100644 (file)
@@ -2017,10 +2017,11 @@ bool LLParser::ParseValID(ValID &ID) {
         return Error(ID.Loc, "getelementptr requires pointer operand");
       
       if (!GetElementPtrInst::getIndexedType(Elts[0]->getType(),
-                                             (Value**)&Elts[1], Elts.size()-1))
+                                             (Value**)(Elts.data() + 1),
+                                             Elts.size() - 1))
         return Error(ID.Loc, "invalid indices for getelementptr");
       ID.ConstantVal = Context.getConstantExprGetElementPtr(Elts[0],
-                                                      &Elts[1], Elts.size()-1);
+                                              Elts.data() + 1, Elts.size() - 1);
     } else if (Opc == Instruction::Select) {
       if (Elts.size() != 3)
         return Error(ID.Loc, "expected three operands to select");
diff --git a/test/Assembler/2009-07-24-ZeroArgGEP.ll b/test/Assembler/2009-07-24-ZeroArgGEP.ll
new file mode 100644 (file)
index 0000000..ce4a961
--- /dev/null
@@ -0,0 +1,5 @@
+; RUN: llvm-as %s -o /dev/null -f
+
+@foo = global i32 0
+@bar = constant i32* getelementptr(i32* @foo)
+