From af88c58fb826aad723367d1b1ac09b6b64c87c68 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 8 Jun 2010 00:33:50 -0400 Subject: [PATCH] re PR c++/44366 ([C++0x] g++ crashes when declaring a lambda expression using a typedef'd decltype.) PR c++/44366 * error.c (dump_parameters): Mask out TFF_SCOPE. (dump_simple_decl): Don't print the scope of a PARM_DECL. (dump_scope): Remove no-op mask. From-SVN: r160420 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/error.c | 4 +++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/decltype23.C | 12 ++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/decltype23.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 77d7c511269..bf6833664cf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2010-06-07 Jason Merrill + PR c++/44366 + * error.c (dump_parameters): Mask out TFF_SCOPE. + (dump_simple_decl): Don't print the scope of a PARM_DECL. + (dump_scope): Remove no-op mask. + PR c++/44401 * parser.c (cp_parser_lookup_name): Fix naming the constructor. diff --git a/gcc/cp/error.c b/gcc/cp/error.c index d535f05a54d..7730e4bb17a 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -115,7 +115,7 @@ init_error (void) static void dump_scope (tree scope, int flags) { - int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF)); + int f = flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF); if (scope == NULL_TREE) return; @@ -865,6 +865,7 @@ dump_simple_decl (tree t, tree type, int flags) pp_maybe_space (cxx_pp); } if (! (flags & TFF_UNQUALIFIED_NAME) + && TREE_CODE (t) != PARM_DECL && (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)) dump_scope (CP_DECL_CONTEXT (t), flags); @@ -1355,6 +1356,7 @@ static void dump_parameters (tree parmtypes, int flags) { int first = 1; + flags &= ~TFF_SCOPE; pp_cxx_left_paren (cxx_pp); for (first = 1; parmtypes != void_list_node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9b9c7a9c18..a32bcb0a853 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-06-07 Jason Merrill + + PR c++/44366 + * g++.dg/cpp0x/decltype23.C: New. + 2010-06-08 Andrew Pinski Shujing Zhao diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype23.C b/gcc/testsuite/g++.dg/cpp0x/decltype23.C new file mode 100644 index 00000000000..6d8dff9bb4b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype23.C @@ -0,0 +1,12 @@ +// PR c++/44366 +// While printing the operand of decltype We were trying to print f as the +// scope of t, causing infinite recursion. +// { dg-options "-std=c++0x" } + +template +void f(T t, decltype(*t)) +{ + struct A { void g() { + foo; // { dg-error "foo" } + } }; +}