From 5a706c322d07f1c834b4120fd98d943b806b4228 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 5 Sep 2012 00:16:58 -0400 Subject: [PATCH] re PR c++/54420 (Segmentation fault in decl_mangling_context) 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 | 7 +++++++ gcc/cp/cp-lang.c | 2 +- gcc/cp/cp-tree.h | 6 +----- gcc/cp/error.c | 2 +- gcc/cp/name-lookup.c | 7 +++---- gcc/cp/semantics.c | 8 ++++---- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C | 6 ++++++ 8 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9148bbe..4501217 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2012-09-04 Jason Merrill + 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. diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index da7f1e1..0e90ab2 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -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, diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index bd57b92..fa3d7b0 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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" diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 7d60fe0..80a145d 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -657,7 +657,7 @@ dump_aggr_type (tree t, int flags) else pp_printf (pp_base (cxx_pp), M_(""), 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_(" + 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 index 0000000..4c268c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C @@ -0,0 +1,6 @@ +// PR c++/54420 + +class __lambda +{ + virtual bool is_sub (); +}; -- 2.7.4