diff options
-rw-r--r-- | lib/AsmParser/LLParser.cpp | 12 | ||||
-rw-r--r-- | test/Assembler/alias-redefinition.ll | 7 |
2 files changed, 14 insertions, 5 deletions
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 32037df958..892cff6f8f 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -673,9 +673,8 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc, return Error(AliaseeLoc, "alias must have pointer type"); // Okay, create the alias but do not insert it into the module yet. - GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), - (GlobalValue::LinkageTypes)Linkage, Name, - Aliasee); + std::unique_ptr<GlobalAlias> GA(new GlobalAlias( + Aliasee->getType(), (GlobalValue::LinkageTypes)Linkage, Name, Aliasee)); GA->setVisibility((GlobalValue::VisibilityTypes)Visibility); GA->setDLLStorageClass((GlobalValue::DLLStorageClassTypes)DLLStorageClass); @@ -697,15 +696,18 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc, // If they agree, just RAUW the old value with the alias and remove the // forward ref info. - Val->replaceAllUsesWith(GA); + Val->replaceAllUsesWith(GA.get()); Val->eraseFromParent(); ForwardRefVals.erase(I); } // Insert into the module, we know its name won't collide now. - M->getAliasList().push_back(GA); + M->getAliasList().push_back(GA.get()); assert(GA->getName() == Name && "Should not be a name conflict!"); + // The module owns this now + GA.release(); + return false; } diff --git a/test/Assembler/alias-redefinition.ll b/test/Assembler/alias-redefinition.ll new file mode 100644 index 0000000000..19ad85bf5f --- /dev/null +++ b/test/Assembler/alias-redefinition.ll @@ -0,0 +1,7 @@ +; RUN: not llvm-as %s 2>&1 | FileCheck %s + +; CHECK: error: redefinition of global named '@bar' + +@foo = global i32 0 +@bar = alias i32* @foo +@bar = alias i32* @foo |