diff options
author | Jason Merrill <jason@redhat.com> | 2013-07-29 15:40:13 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-07-29 15:40:13 -0400 |
commit | 88e594b6de5efb2b463bb6e4b0d2ed875def0d25 (patch) | |
tree | 7c729aadab74419596d84d5cc8d3c2937438fed8 /gcc/cp | |
parent | 502af4917687e59654128c9eb717b56b88df459e (diff) | |
download | gcc-88e594b6de5efb2b463bb6e4b0d2ed875def0d25.zip gcc-88e594b6de5efb2b463bb6e4b0d2ed875def0d25.tar.gz gcc-88e594b6de5efb2b463bb6e4b0d2ed875def0d25.tar.bz2 |
mangle.c (write_name): Check for null context.
* mangle.c (write_name): Check for null context.
(write_unscoped_name): Allow PARM_DECL context.
From-SVN: r201317
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 14 |
2 files changed, 13 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2669375..21eaa1f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-07-29 Jason Merrill <jason@redhat.com> + + * mangle.c (write_name): Check for null context. + (write_unscoped_name): Allow PARM_DECL context. + 2013-07-25 Paolo Carlini <paolo.carlini@oracle.com> PR c++/57981 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 68b956b..3cfca58 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -798,13 +798,14 @@ write_name (tree decl, const int ignore_local_scope) context = decl_mangling_context (decl); + gcc_assert (context != NULL_TREE); + /* A decl in :: or ::std scope is treated specially. The former is mangled using <unscoped-name> or <unscoped-template-name>, the latter with a special substitution. Also, a name that is directly in a local function scope is also mangled with <unscoped-name> rather than a full <nested-name>. */ - if (context == NULL - || context == global_namespace + if (context == global_namespace || DECL_NAMESPACE_STD_P (context) || (ignore_local_scope && (TREE_CODE (context) == FUNCTION_DECL @@ -837,10 +838,10 @@ write_name (tree decl, const int ignore_local_scope) directly in that function's scope, either decl or one of its enclosing scopes. */ tree local_entity = decl; - while (context != NULL && context != global_namespace) + while (context != global_namespace) { /* Make sure we're always dealing with decls. */ - if (context != NULL && TYPE_P (context)) + if (TYPE_P (context)) context = TYPE_NAME (context); /* Is this a function? */ if (TREE_CODE (context) == FUNCTION_DECL @@ -883,9 +884,10 @@ write_unscoped_name (const tree decl) else { /* If not, it should be either in the global namespace, or directly - in a local function scope. */ + in a local function scope. A lambda can also be mangled in the + scope of a default argument. */ gcc_assert (context == global_namespace - || context != NULL + || TREE_CODE (context) == PARM_DECL || TREE_CODE (context) == FUNCTION_DECL); write_unqualified_name (decl); |