diff options
author | Geoffrey Keating <geoffk@apple.com> | 2007-05-06 00:01:36 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2007-05-06 00:01:36 +0000 |
commit | a2aa65f063a85d23f961337510d3a9395d79de41 (patch) | |
tree | 346b513c9858f2b4fdf34b115a7ccc9103a94c85 /gcc | |
parent | fabfde2e514c7125771651dc933bba9503bc0e67 (diff) | |
download | gcc-a2aa65f063a85d23f961337510d3a9395d79de41.zip gcc-a2aa65f063a85d23f961337510d3a9395d79de41.tar.gz gcc-a2aa65f063a85d23f961337510d3a9395d79de41.tar.bz2 |
Index: libiberty/ChangeLog
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/nested-extern-1.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/nested-extern-2.C | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/nested-extern.cc | 1 |
6 files changed, 66 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 52bf5e8..b4a1c9a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 40c059a..31676e7 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -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)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8ea1b2..586cc74 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..6533a2a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/nested-extern-1.C @@ -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 index 0000000..58f53e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/nested-extern-2.C @@ -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 index 0000000..048f715 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/nested-extern.cc @@ -0,0 +1 @@ +int i; |