/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jun 2015 15:11:06 +0000 (15:11 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jun 2015 15:11:06 +0000 (15:11 +0000)
2015-06-24  Adam Butcher  <adam@jessamine.co.uk>

PR c++/65750
* parser.c (cp_parser_simple_type_specifier): Don't synthesize
implicit template parm if 'auto' is a placeholder for trailing
return type.

/testsuite
2015-06-24  Adam Butcher  <adam@jessamine.co.uk>

PR c++/65750
* g++.dg/cpp0x/trailing11.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@224901 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 4b27519..c9c3977 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-24  Adam Butcher  <adam@jessamine.co.uk>
+
+       PR c++/65750
+       * parser.c (cp_parser_simple_type_specifier): Don't synthesize
+       implicit template parm if 'auto' is a placeholder for trailing
+       return type.
+
 2015-06-24  Patrick Palka  <ppalka@gcc.gnu.org>
 
        Revert:
index 9a1cbd8..5150abe 100644 (file)
@@ -14939,6 +14939,30 @@ cp_parser_simple_type_specifier (cp_parser* parser,
       maybe_warn_cpp0x (CPP0X_AUTO);
       if (parser->auto_is_implicit_function_template_parm_p)
        {
+         /* The 'auto' might be the placeholder return type for a function decl
+            with trailing return type.  */
+         bool have_trailing_return_fn_decl = false;
+         if (cp_lexer_peek_nth_token (parser->lexer, 2)->type
+             == CPP_OPEN_PAREN)
+           {
+             cp_parser_parse_tentatively (parser);
+             cp_lexer_consume_token (parser->lexer);
+             cp_lexer_consume_token (parser->lexer);
+             if (cp_parser_skip_to_closing_parenthesis (parser,
+                                                        /*recovering*/false,
+                                                        /*or_comma*/false,
+                                                        /*consume_paren*/true))
+               have_trailing_return_fn_decl
+                 = cp_lexer_next_token_is (parser->lexer, CPP_DEREF);
+             cp_parser_abort_tentative_parse (parser);
+           }
+
+         if (have_trailing_return_fn_decl)
+           {
+             type = make_auto ();
+             break;
+           }
+
          if (cxx_dialect >= cxx14)
            type = synthesize_implicit_template_parm (parser);
          else
index 40d8497..af6d43a 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-24  Adam Butcher  <adam@jessamine.co.uk>
+
+       PR c++/65750
+       * g++.dg/cpp0x/trailing11.C: New.
+
 2015-06-24  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
        * gcc.target/arm/fixed_float_conversion.c: Skip for inappropriate
diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing11.C b/gcc/testsuite/g++.dg/cpp0x/trailing11.C
new file mode 100644 (file)
index 0000000..0c9e908
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/65750
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct F { };
+
+class a
+{
+  virtual auto f( F< void () > ) -> void;
+  virtual auto g( F< auto () -> void > ) -> void;
+};
+
+auto main() -> int { }