diff options
-rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Assembler/unsized-recursive-type.ll | 9 |
2 files changed, 15 insertions, 2 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 65e622af66c..c1d2810a5cf 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -2810,7 +2810,9 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) { } } - if (!Indices.empty() && !BasePointerType->getElementType()->isSized()) + SmallPtrSet<const Type*, 4> Visited; + if (!Indices.empty() && + !BasePointerType->getElementType()->isSized(&Visited)) return Error(ID.Loc, "base element of getelementptr must be sized"); if (!GetElementPtrInst::getIndexedType(Elts[0]->getType(), Indices)) @@ -5496,7 +5498,9 @@ int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) { Indices.push_back(Val); } - if (!Indices.empty() && !BasePointerType->getElementType()->isSized()) + SmallPtrSet<const Type*, 4> Visited; + if (!Indices.empty() && + !BasePointerType->getElementType()->isSized(&Visited)) return Error(Loc, "base element of getelementptr must be sized"); if (!GetElementPtrInst::getIndexedType(BaseType, Indices)) diff --git a/llvm/test/Assembler/unsized-recursive-type.ll b/llvm/test/Assembler/unsized-recursive-type.ll new file mode 100644 index 00000000000..b6d93fa19fe --- /dev/null +++ b/llvm/test/Assembler/unsized-recursive-type.ll @@ -0,0 +1,9 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +; CHECK: base element of getelementptr must be sized + +%myTy = type { %myTy } +define void @foo(%myTy* %p){ + %0 = getelementptr %myTy, %myTy* %p, i32 0 + ret void +} |