PR c++/84374 - diagnose invalid uses of decltype(auto).
authorMarek Polacek <polacek@redhat.com>
Tue, 10 Sep 2019 02:29:13 +0000 (02:29 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 10 Sep 2019 02:29:13 +0000 (02:29 +0000)
* decl.c (grokdeclarator): Diagnose wrong usage of decltype(auto) in
a function declaration.

* g++.dg/cpp1y/auto-fn57.C: New test.

From-SVN: r275557

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/auto-fn57.C [new file with mode: 0644]

index 48582cea2f21bd377bf42f0288d011ae402e8647..2b98a06d58690a0e398e055a4bbe99337a7de689 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-09  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/84374 - diagnose invalid uses of decltype(auto).
+       * decl.c (grokdeclarator): Diagnose wrong usage of decltype(auto) in
+       a function declaration.
+
 2019-09-06  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/91125
index 88e2c3beb2bcc51d31868948f199c548296cc4e8..dfcd7b16e6e72831862d778484fa324c242d967e 100644 (file)
@@ -11681,6 +11681,16 @@ grokdeclarator (const cp_declarator *declarator,
                          "allowed");
                return error_mark_node;
              }
+           /* Only plain decltype(auto) is allowed.  */
+           if (tree a = type_uses_auto (type))
+             {
+               if (AUTO_IS_DECLTYPE (a) && a != type)
+                 {
+                   error_at (typespec_loc, "%qT as type rather than "
+                             "plain %<decltype(auto)%>", type);
+                   return error_mark_node;
+                 }
+             }
 
            if (ctype == NULL_TREE
                && decl_context == FIELD
index 3d4ada855790e28adfb6e211aba47939dc586cfd..f738a231358eb1018d9ae8435a54a0e6819c791f 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-09  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/84374 - diagnose invalid uses of decltype(auto).
+       * g++.dg/cpp1y/auto-fn57.C: New test.
+
 2019-09-09  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * gcc.target/powerpc/rlwinm-0.c: Adjust expected instruction counts.
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn57.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn57.C
new file mode 100644 (file)
index 0000000..e58df18
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/84374 - diagnose invalid uses of decltype(auto).
+// { dg-do compile { target c++14 } }
+
+auto l = [](auto* r)->decltype(auto)* { return r; }; // { dg-error "as type rather than plain" }
+auto m = [](auto* r)->decltype(auto)& { return *r; }; // { dg-error "as type rather than plain" }
+
+decltype(auto)* f(); // { dg-error "as type rather than plain" }
+decltype(auto)& f2(); // { dg-error "as type rather than plain" }
+decltype(auto)* f3() { return 42; } // { dg-error "as type rather than plain" }
+decltype(auto)& f4() { return 42; } // { dg-error "as type rather than plain" }
+
+
+class C {
+  decltype(auto)* g(); // { dg-error "as type rather than plain" }
+  decltype(auto)& g2(); // { dg-error "as type rather than plain" }
+  decltype(auto)* g3() { } // { dg-error "as type rather than plain" }
+  decltype(auto)& g4() { } // { dg-error "as type rather than plain" }
+};