diff mbox

PATCH Re: [c++] Question about "write_unscoped_name (const tree decl)"

Message ID 51F6C58A.7000804@redhat.com
State New
Headers show

Commit Message

Jason Merrill July 29, 2013, 7:42 p.m. UTC
On 07/29/2013 10:37 AM, Jason Merrill wrote:
> Yep, I'll deal.

Thus.

Tested x86_64-pc-linux-gnu, applying to trunk.
diff mbox

Patch

commit 1b76aeef615189d8b224201dac911f479900f0f5
Author: Jason Merrill <jason@redhat.com>
Date:   Mon Jul 29 10:32:20 2013 -0400

    	* mangle.c (write_name): Check for null context.
    	(write_unscoped_name): Allow PARM_DECL context.

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