re PR c++/28262 (Inconsistent "default arguments are only permitted for function...
authorPaolo Carlini <paolo.carlini@oracle.com>
Sat, 6 Jul 2013 08:54:56 +0000 (08:54 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sat, 6 Jul 2013 08:54:56 +0000 (08:54 +0000)
/cp
2013-07-06  Paolo Carlini  <paolo.carlini@oracle.com>

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  <paolo.carlini@oracle.com>

PR c++/28262
* g++.dg/parse/defarg16.C: New.

From-SVN: r200730

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/defarg16.C [new file with mode: 0644]

index c45c8be9aa64af17ec96453b92148b478642f5dc..333249a4bd1a214c11d7bb85d58d4e638c7ba223 100644 (file)
@@ -1,3 +1,9 @@
+2013-07-06  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       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  <paolo.carlini@oracle.com>
 
        PR c++/14263
index 46a8deb588fe5ae2b6a189649ef9b3b800e81c1c..05643e46ad85ac0ec5ccf063c53f0cd3fbc78e7a 100644 (file)
@@ -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)
index b84de4bc7d0f21ae4f5d7ce3c8ed476c4e17c9b4..71615362afc890eda02dfc9e8cc90cca0cd6a344 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-06  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/28262
+       * g++.dg/parse/defarg16.C: New.
+
 2013-07-05  Vladimir Makarov  <vmakarov@redhat.com>
 
        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 (file)
index 0000000..8eb0014
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/28262
+
+typedef void (funcptrhack) (int = 10);   // { dg-error "default arguments" }
+typedef funcptrhack * funcptr;