diff options
author | Chris Lattner <sabre@nondot.org> | 2003-11-12 04:40:30 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-11-12 04:40:30 +0000 |
commit | 15b697214e01cd532e085105c2a2474b9b09c572 (patch) | |
tree | 6a4e598e24331df1846ec692cdb63f9c05a5be7c | |
parent | 400b89628e14cd5ae7ca78e9173598bb6b7d022f (diff) |
Fix bug PR107, patch contributed by Reid Spencer!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9911 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index a55e735ca4..e930bc55eb 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -147,6 +147,7 @@ static struct PerFunctionInfo { std::vector<ValueList> LateResolveValues; std::vector<PATypeHolder> Types; std::map<ValID, PATypeHolder> LateResolveTypes; + SymbolTable LocalSymtab; bool isDeclare; // Is this function a forward declararation? inline PerFunctionInfo() { @@ -183,7 +184,8 @@ static struct PerFunctionInfo { CurModule.DeclareNewGlobalValue(CurrentFunction, FID); Values.clear(); // Clear out function local definitions - Types.clear(); + Types.clear(); // Clear out function local types + LocalSymtab.clear(); // Clear out function local symbol table CurrentFunction = 0; isDeclare = false; } @@ -555,7 +557,30 @@ static bool setValueName(Value *V, char *NameStr) { V->getType()->getDescription() + "' type plane!"); } + // Set the name V->setName(Name, &ST); + + // If we're in function scope + if (inFunctionScope()) { + // Look up the symbol in the function's local symboltable + Existing = CurFun.LocalSymtab.lookup(V->getType(),Name); + + // If it already exists + if (Existing) { + // Clear the symbol table so it doesn't complain when it + // gets destructed + CurFun.LocalSymtab.clear(); + + // Bail + ThrowException("Redefinition of value named '" + Name + "' in the '" + + V->getType()->getDescription() + "' type plane!"); + + // otherwise, since it doesn't exist + } else { + // Insert it. + CurFun.LocalSymtab.insert(V); + } + } return false; } |