From 5504e5d864f7b9c83727669847396c639abdf77b Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sat, 6 Jul 2013 08:54:56 +0000 Subject: [PATCH] re PR c++/28262 (Inconsistent "default arguments are only permitted for function parameters".) /cp 2013-07-06 Paolo Carlini PR c++/28262 * parser.c (cp_parser_init_declarator): If we are parsing a typedef set parser->default_arg_ok_p to false before cp_parser_declarator. /testsuite 2013-07-06 Paolo Carlini PR c++/28262 * g++.dg/parse/defarg16.C: New. From-SVN: r200730 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/parse/defarg16.C | 4 ++++ 4 files changed, 22 insertions(+) create mode 100644 gcc/testsuite/g++.dg/parse/defarg16.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c45c8be9aa6..333249a4bd1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-07-06 Paolo Carlini + + PR c++/28262 + * parser.c (cp_parser_init_declarator): If we are parsing a typedef + set parser->default_arg_ok_p to false before cp_parser_declarator. + 2013-07-05 Paolo Carlini PR c++/14263 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 46a8deb588f..05643e46ad8 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -16182,6 +16182,7 @@ cp_parser_init_declarator (cp_parser* parser, bool friend_p; tree pushed_scope = NULL_TREE; bool range_for_decl_p = false; + bool saved_default_arg_ok_p = parser->default_arg_ok_p; /* Gather the attributes that were provided with the decl-specifiers. */ @@ -16192,6 +16193,10 @@ cp_parser_init_declarator (cp_parser* parser, if (function_definition_p) *function_definition_p = false; + /* Default arguments are only permitted for function parameters. */ + if (decl_spec_seq_has_spec_p (decl_specifiers, ds_typedef)) + parser->default_arg_ok_p = false; + /* Defer access checks while parsing the declarator; we cannot know what names are accessible until we know what is being declared. */ @@ -16207,6 +16212,8 @@ cp_parser_init_declarator (cp_parser* parser, /* Gather up the deferred checks. */ stop_deferring_access_checks (); + parser->default_arg_ok_p = saved_default_arg_ok_p; + /* If the DECLARATOR was erroneous, there's no need to go further. */ if (declarator == cp_error_declarator) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b84de4bc7d0..71615362afc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-07-06 Paolo Carlini + + PR c++/28262 + * g++.dg/parse/defarg16.C: New. + 2013-07-05 Vladimir Makarov PR rtl-optimization/55342 diff --git a/gcc/testsuite/g++.dg/parse/defarg16.C b/gcc/testsuite/g++.dg/parse/defarg16.C new file mode 100644 index 00000000000..8eb0014ddbf --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg16.C @@ -0,0 +1,4 @@ +// PR c++/28262 + +typedef void (funcptrhack) (int = 10); // { dg-error "default arguments" } +typedef funcptrhack * funcptr;