aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-07-29 15:40:13 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-07-29 15:40:13 -0400
commit88e594b6de5efb2b463bb6e4b0d2ed875def0d25 (patch)
tree7c729aadab74419596d84d5cc8d3c2937438fed8 /gcc/cp
parent502af4917687e59654128c9eb717b56b88df459e (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/mangle.c14
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);