Index: libiberty/ChangeLog
authorGeoffrey Keating <geoffk@apple.com>
Sun, 6 May 2007 00:01:36 +0000 (00:01 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Sun, 6 May 2007 00:01:36 +0000 (00:01 +0000)
2007-05-04  Geoffrey Keating  <geoffk@apple.com>

* cp-demangle.c (d_name): Detect local-source-name.
(d_prefix): Likewise.
(d_unqualified_name): Implement local-source-name.

Index: gcc/cp/ChangeLog
2007-05-04  Geoffrey Keating  <geoffk@apple.com>

PR 31775
* mangle.c (write_mangled_name): Mangle static variable names.
(write_unqualified_name): Use local-source-name for
namespace-scope static variables.

Index: gcc/testsuite/ChangeLog
2007-05-04  Geoffrey Keating  <geoffk@apple.com>

PR 31775
* g++.dg/other/nested-extern.cc: New.
* g++.dg/other/nested-extern-1.C: New.
* g++.dg/other/nested-extern-2.C: New.

From-SVN: r124467

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/nested-extern-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/nested-extern-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/nested-extern.cc [new file with mode: 0644]
libiberty/ChangeLog
libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected

index 52bf5e8654c87e6edff701a716d7d9d3e84a48f0..b4a1c9a1b0a3eb1fcb14e8f89106462499b9f9d0 100644 (file)
@@ -1,3 +1,10 @@
+2007-05-05  Geoffrey Keating  <geoffk@apple.com>
+
+       PR 31775
+       * mangle.c (write_mangled_name): Mangle static variable names.
+       (write_unqualified_name): Use local-source-name for
+       namespace-scope static variables.
+
 2007-05-04  Dirk Mueller  <dmueller@suse.de>
 
        * cp-tree.h (DECL_MAIN_P): only if -ffreestanding is
index 40c059ad63ceb38bbf05f338a565cacb3e59e897..31676e7b454055413e0654114465d05816aba3af 100644 (file)
@@ -688,7 +688,8 @@ write_mangled_name (const tree decl, bool top_level)
        }
     }
   else if (TREE_CODE (decl) == VAR_DECL
-          /* The names of global variables aren't mangled.  */
+          /* The names of non-static global variables aren't mangled.  */
+          && DECL_EXTERNAL_LINKAGE_P (decl)
           && (CP_DECL_CONTEXT (decl) == global_namespace
               /* And neither are `extern "C"' variables.  */
               || DECL_EXTERN_C_P (decl)))
@@ -1086,7 +1087,10 @@ write_template_prefix (const tree node)
 
     <unqualified-name>  ::= <operator-name>
                        ::= <special-name>
-                       ::= <source-name>  */
+                       ::= <source-name>
+                       ::= <local-source-name> 
+
+    <local-source-name>        ::= L <source-name> <discriminator> */
 
 static void
 write_unqualified_name (const tree decl)
@@ -1126,6 +1130,16 @@ write_unqualified_name (const tree decl)
 
       write_string (oni[DECL_OVERLOADED_OPERATOR_P (decl)].mangled_name);
     }
+  else if (VAR_OR_FUNCTION_DECL_P (decl) && ! TREE_PUBLIC (decl)
+          && DECL_NAMESPACE_SCOPE_P (decl)
+          && decl_linkage (decl) == lk_internal)
+    {
+      MANGLE_TRACE_TREE ("local-source-name", decl);
+      write_char ('L');
+      write_source_name (DECL_NAME (decl));
+      /* The default discriminator is 1, and that's all we ever use,
+        so there's no code to output one here.  */
+    }
   else
     write_source_name (DECL_NAME (decl));
 }
index c8ea1b29ae3cc30647d3e9853b0bdd8ad87526d3..586cc74f5297eca2b0f8e8d5bdfbf20d989c7fb8 100644 (file)
@@ -1,3 +1,10 @@
+2007-05-05  Geoffrey Keating  <geoffk@apple.com>
+
+       PR 31775
+       * g++.dg/other/nested-extern.cc: New.
+       * g++.dg/other/nested-extern-1.C: New.
+       * g++.dg/other/nested-extern-2.C: New.
+
 2007-05-04  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/31760
diff --git a/gcc/testsuite/g++.dg/other/nested-extern-1.C b/gcc/testsuite/g++.dg/other/nested-extern-1.C
new file mode 100644 (file)
index 0000000..6533a2a
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do run } */
+// { dg-additional-sources "nested-extern.cc" }
+/* PR 31775 */
+extern "C" void abort();
+extern int *p;
+int main()
+{ 
+  extern int i;
+  i = 1;
+  *p = 2;
+  if (i == 2)
+    abort ();
+  return 0;
+}
+
+static int i;
+int *p = &i;
diff --git a/gcc/testsuite/g++.dg/other/nested-extern-2.C b/gcc/testsuite/g++.dg/other/nested-extern-2.C
new file mode 100644 (file)
index 0000000..58f53e0
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do run } */
+// { dg-additional-sources "nested-extern.cc" }
+/* PR 31775 */
+extern "C" void abort();
+static int i;
+int *p = &i;
+int main()
+{ 
+  int i;
+  { 
+    extern int i;
+    i = 1;
+    *p = 2;
+    if (i == 2)
+      abort ();
+  }
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/other/nested-extern.cc b/gcc/testsuite/g++.dg/other/nested-extern.cc
new file mode 100644 (file)
index 0000000..048f715
--- /dev/null
@@ -0,0 +1 @@
+int i;
index 431ef1db2ff6871c2cf7d11eb912009dcf52bdfb..c4e707210369df89070e502b39110a664660aabc 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-05  Geoffrey Keating  <geoffk@apple.com>
+
+       * cp-demangle.c (d_name): Detect local-source-name.
+       (d_prefix): Likewise.
+       (d_unqualified_name): Implement local-source-name.
+
 2007-05-03  Joel Brobecker  <brobecker@adacore.com>
 
        * filename_cmp.c: Replace include of ctype.h by include of
index 5c930c6ab3f2045dc8c10d4e5b40f43bad0e851c..992b3580bf7c4642bffe6f6dd571e9ad5263b19d 100644 (file)
@@ -1100,6 +1100,9 @@ d_name (struct d_info *di)
     case 'Z':
       return d_local_name (di);
 
+    case 'L':
+      return d_unqualified_name (di);
+       
     case 'S':
       {
        int subst;
@@ -1220,7 +1223,8 @@ d_prefix (struct d_info *di)
       if (IS_DIGIT (peek)
          || IS_LOWER (peek)
          || peek == 'C'
-         || peek == 'D')
+         || peek == 'D'
+         || peek == 'L')
        dc = d_unqualified_name (di);
       else if (peek == 'S')
        dc = d_substitution (di, 1);
@@ -1254,6 +1258,9 @@ d_prefix (struct d_info *di)
 /* <unqualified-name> ::= <operator-name>
                       ::= <ctor-dtor-name>
                       ::= <source-name>
+                     ::= <local-source-name> 
+
+    <local-source-name>        ::= L <source-name> <discriminator>
 */
 
 static struct demangle_component *
@@ -1275,6 +1282,19 @@ d_unqualified_name (struct d_info *di)
     }
   else if (peek == 'C' || peek == 'D')
     return d_ctor_dtor_name (di);
+  else if (peek == 'L')
+    {
+      struct demangle_component * ret;
+
+      d_advance (di, 1);
+
+      ret = d_source_name (di);
+      if (ret == NULL)
+       return NULL;
+      if (! d_discriminator (di))
+       return NULL;
+      return ret;
+    }
   else
     return NULL;
 }
index 471819e26c0fae971ac54c96098d8123e456c7b5..f1afc45c8c9b0bf80c237c066eafc2278902ab4c 100644 (file)
@@ -3842,3 +3842,19 @@ _ZNT
 --format=gnu-v3
 _Z1aMark
 _Z1aMark
+# <local-source-name> test 1
+--format=gnu-v3
+_ZL3foo_2
+foo
+# <local-source-name> test 2
+--format=gnu-v3
+_ZZL3foo_2vE4var1
+foo()::var1
+# <local-source-name> test 3
+--format=gnu-v3
+_ZZL3foo_2vE4var1_0
+foo()::var1
+# <local-source-name> test 4
+--format=gnu-v3
+_ZZN7myspaceL3foo_1EvEN11localstruct1fEZNS_3fooEvE16otherlocalstruct
+myspace::foo()::localstruct::f(myspace::foo()::otherlocalstruct)