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
This commit is contained in:
Geoffrey Keating 2007-05-06 00:01:36 +00:00 committed by Geoffrey Keating
parent fabfde2e51
commit a2aa65f063
9 changed files with 109 additions and 3 deletions

View 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

View 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));
}

View 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

View File

@ -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;

View File

@ -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;
}

View File

@ -0,0 +1 @@
int i;

View 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

View 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;
}

View 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)