From: Jason Merrill Date: Wed, 5 Sep 2012 04:16:58 +0000 (-0400) Subject: re PR c++/54420 (Segmentation fault in decl_mangling_context) X-Git-Tag: misc/gccgo-go1_1_2~1039 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5a706c322d07f1c834b4120fd98d943b806b4228;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9148bbe07719..4501217f056e 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 da7f1e1f7ed3..0e90ab2a80de 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 bd57b92c9619..fa3d7b0b774f 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 7d60fe00c186..80a145d974c5 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 000000000000..4c268c678207 --- /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 (); +};