OSDN Git Service

PR c++/38256
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Dec 2008 21:42:22 +0000 (21:42 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Dec 2008 21:42:22 +0000 (21:42 +0000)
        * parser.c (cp_parser_conversion_type_id): Diagnose
        'operator auto' here.
        * decl.c (grokdeclarator): Not here.

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

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

index 4987ca4..f8bf162 100644 (file)
@@ -1,5 +1,10 @@
 2008-12-03  Jason Merrill  <jason@redhat.com>
 
+       PR c++/38256
+       * parser.c (cp_parser_conversion_type_id): Diagnose
+       'operator auto' here.
+       * decl.c (grokdeclarator): Not here.
+
        PR c++/38380
        * decl.c (grokdeclarator): Only set DECL_NONCONVERTING_P
        on explicit constructors.
index 8714432..f2e12b3 100644 (file)
@@ -8258,12 +8258,7 @@ grokdeclarator (const cp_declarator *declarator,
              {
                if (type_uses_auto (type))
                  {
-                   if (sfk == sfk_conversion)
-                     {
-                       error ("invalid use of %<auto%> in conversion operator");
-                       return error_mark_node;
-                     }
-                   else if (!declarator->u.function.late_return_type)
+                   if (!declarator->u.function.late_return_type)
                      {
                        error ("%qs function uses %<auto%> type specifier without"
                               " late return type", name);
index 275a7f3..45abd24 100644 (file)
@@ -8966,6 +8966,16 @@ cp_parser_conversion_type_id (cp_parser* parser)
                                    /*initialized=*/0, &attributes);
   if (attributes)
     cplus_decl_attributes (&type_specified, attributes, /*flags=*/0);
+
+  /* Don't give this error when parsing tentatively.  This happens to
+     work because we always parse this definitively once.  */
+  if (! cp_parser_uncommitted_to_tentative_parse_p (parser)
+      && type_uses_auto (type_specified))
+    {
+      error ("invalid use of %<auto%> in conversion operator");
+      return error_mark_node;
+    }
+
   return type_specified;
 }
 
index 4a574eb..140c6ae 100644 (file)
@@ -1,5 +1,8 @@
 2008-12-03  Jason Merrill  <jason@redhat.com>
 
+       PR c++/38256
+       * g++.dg/cpp0x/auto11.C: New test.
+
        PR c++/38380
        * g++.dg/cpp0x/initlist10.C: New test.
        * g++.old-deja/g++.eh/ctor1.C: Default ctor is a candidate too.
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto11.C b/gcc/testsuite/g++.dg/cpp0x/auto11.C
new file mode 100644 (file)
index 0000000..bd21dae
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/38256
+// { dg-options "-std=c++0x" }
+
+template<int> struct A
+{
+  template<typename T> operator T();
+};
+
+void foo()
+{
+  A<0>().operator auto();      // { dg-error "auto.*conversion" }
+}