re PR c++/54420 (Segmentation fault in decl_mangling_context)
authorJason Merrill <jason@redhat.com>
Wed, 5 Sep 2012 04:16:58 +0000 (00:16 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 5 Sep 2012 04:16:58 +0000 (00:16 -0400)
PR c++/54420
* cp-tree.h (LAMBDANAME_P): Remove.
(LAMBDA_TYPE_P): Check CLASSTYPE_LAMBDA_EXPR instead.
* cp-lang.c (cxx_dwarf_name): Likewise.
* error.c (dump_aggr_type): Likewise.
* semantics.c (begin_lambda_type): Set CLASSTYPE_LAMBDA_EXPR sooner.

From-SVN: r190961

gcc/cp/ChangeLog
gcc/cp/cp-lang.c
gcc/cp/cp-tree.h
gcc/cp/error.c
gcc/cp/name-lookup.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C [new file with mode: 0644]

index 9148bbe..4501217 100644 (file)
@@ -1,5 +1,12 @@
 2012-09-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/54420
+       * cp-tree.h (LAMBDANAME_P): Remove.
+       (LAMBDA_TYPE_P): Check CLASSTYPE_LAMBDA_EXPR instead.
+       * cp-lang.c (cxx_dwarf_name): Likewise.
+       * error.c (dump_aggr_type): Likewise.
+       * semantics.c (begin_lambda_type): Set CLASSTYPE_LAMBDA_EXPR sooner.
+
        PR c++/54198
        * decl.c (check_default_argument): Set cp_unevaluated_operand
        around call to perform_implicit_conversion_flags.
index da7f1e1..0e90ab2 100644 (file)
@@ -115,7 +115,7 @@ cxx_dwarf_name (tree t, int verbosity)
   gcc_assert (DECL_P (t));
 
   if (DECL_NAME (t)
-      && (ANON_AGGRNAME_P (DECL_NAME (t)) || LAMBDANAME_P (DECL_NAME (t))))
+      && (ANON_AGGRNAME_P (DECL_NAME (t)) || LAMBDA_TYPE_P (t)))
     return NULL;
   if (verbosity >= 2)
     return decl_as_dwarf_string (t,
index bd57b92..fa3d7b0 100644 (file)
@@ -621,7 +621,7 @@ struct GTY (()) tree_trait_expr {
 
 /* Based off of TYPE_ANONYMOUS_P.  */
 #define LAMBDA_TYPE_P(NODE) \
-  (CLASS_TYPE_P (NODE) && LAMBDANAME_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
+  (CLASS_TYPE_P (NODE) && CLASSTYPE_LAMBDA_EXPR (NODE))
 
 /* Test if FUNCTION_DECL is a lambda function.  */
 #define LAMBDA_FUNCTION_P(FNDECL) \
@@ -4329,10 +4329,6 @@ extern GTY(()) VEC(tree,gc) *local_classes;
 
 #define LAMBDANAME_PREFIX "__lambda"
 #define LAMBDANAME_FORMAT LAMBDANAME_PREFIX "%d"
-#define LAMBDANAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), \
-             LAMBDANAME_PREFIX, \
-            sizeof (LAMBDANAME_PREFIX) - 1))
 
 #define UDLIT_OP_ANSI_PREFIX "operator\"\" "
 #define UDLIT_OP_ANSI_FORMAT UDLIT_OP_ANSI_PREFIX "%s"
index 7d60fe0..80a145d 100644 (file)
@@ -657,7 +657,7 @@ dump_aggr_type (tree t, int flags)
       else
        pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
     }
-  else if (LAMBDANAME_P (name))
+  else if (LAMBDA_TYPE_P (name))
     {
       /* A lambda's "type" is essentially its signature.  */
       pp_string (cxx_pp, M_("<lambda"));
index 22bc5e7..0211d4f 100644 (file)
@@ -1998,10 +1998,9 @@ make_anon_name (void)
 }
 
 /* This code is practically identical to that for creating
-   anonymous names, but is just used for lambdas instead.  This is necessary
-   because anonymous names are recognized and cannot be passed to template
-   functions.  */
-/* FIXME is this still necessary? */
+   anonymous names, but is just used for lambdas instead.  This isn't really
+   necessary, but it's convenient to avoid treating lambdas like other
+   anonymous types.  */
 
 static GTY(()) int lambda_cnt = 0;
 
index 183a78a..f64246d 100644 (file)
@@ -8746,6 +8746,10 @@ begin_lambda_type (tree lambda)
   /* Designate it as a struct so that we can use aggregate initialization.  */
   CLASSTYPE_DECLARED_CLASS (type) = false;
 
+  /* Cross-reference the expression and the type.  */
+  LAMBDA_EXPR_CLOSURE (lambda) = type;
+  CLASSTYPE_LAMBDA_EXPR (type) = lambda;
+
   /* Clear base types.  */
   xref_basetypes (type, /*bases=*/NULL_TREE);
 
@@ -8754,10 +8758,6 @@ begin_lambda_type (tree lambda)
   if (type == error_mark_node)
     return error_mark_node;
 
-  /* Cross-reference the expression and the type.  */
-  LAMBDA_EXPR_CLOSURE (lambda) = type;
-  CLASSTYPE_LAMBDA_EXPR (type) = lambda;
-
   return type;
 }
 
index 0082a9c..31d219a 100644 (file)
@@ -1,5 +1,8 @@
 2012-09-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/54420
+       * g++.dg/cpp0x/lambda/lambda-intname.C: New.
+
        PR c++/54198
        * g++.dg/template/defarg15.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C
new file mode 100644 (file)
index 0000000..4c268c6
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/54420
+
+class __lambda
+{
+  virtual bool is_sub ();
+};