Fix bug PR107, patch contributed by Reid Spencer!
authorChris Lattner <sabre@nondot.org>
Wed, 12 Nov 2003 04:40:30 +0000 (04:40 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 12 Nov 2003 04:40:30 +0000 (04:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9911 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/llvmAsmParser.y

index a55e735ca493f57b1d52a3ef83566c4c7affff6f..e930bc55eb88d47d7fbfd477b90547f715f022df 100644 (file)
@@ -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;
 }