OSDN Git Service

reject PR3281:crash09.ll with this diagnostic:
authorChris Lattner <sabre@nondot.org>
Mon, 5 Jan 2009 18:19:46 +0000 (18:19 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 5 Jan 2009 18:19:46 +0000 (18:19 +0000)
llvm-as: crash09.ll:3:1: self referential type is invalid
type %0
^

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

lib/AsmParser/LLParser.cpp

index da8cb4d..27dbf88 100644 (file)
@@ -238,6 +238,9 @@ bool LLParser::ParseUnnamedType() {
   std::map<unsigned, std::pair<PATypeHolder, LocTy> >::iterator
     FI = ForwardRefTypeIDs.find(TypeID);
   if (FI != ForwardRefTypeIDs.end()) {
+    if (FI->second.first.get() == Ty)
+      return Error(TypeLoc, "self referential type is invalid");
+    
     cast<DerivedType>(FI->second.first.get())->refineAbstractTypeTo(Ty);
     Ty = FI->second.first.get();
     ForwardRefTypeIDs.erase(FI);
@@ -275,6 +278,9 @@ bool LLParser::ParseNamedType() {
   std::map<std::string, std::pair<PATypeHolder, LocTy> >::iterator
   FI = ForwardRefTypes.find(Name);
   if (FI != ForwardRefTypes.end()) {
+    if (FI->second.first.get() == Ty)
+      return Error(NameLoc, "self referential type is invalid");
+
     cast<DerivedType>(FI->second.first.get())->refineAbstractTypeTo(Ty);
     Ty = FI->second.first.get();
     ForwardRefTypes.erase(FI);