If you try to use decltype(auto) in C++11, we emit obscure
error: expected primary-expression before 'auto'
giving the user no hint as to what's wrong. This patch improves that
diagnostic. Since we've been giving an error, I'm also using error().
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
gcc/cp/ChangeLog:
PR c++/96103
* parser.c (cp_parser_decltype): Print error about using decltype(auto)
in C++11. Check that the token following "auto" is ")".
gcc/testsuite/ChangeLog:
PR c++/96103
* g++.dg/cpp0x/decltype77.C: New test.
---
gcc/cp/parser.c | 22 +++++++++++++++-------
gcc/testsuite/g++.dg/cpp0x/decltype77.C | 10 ++++++++++
2 files changed, 25 insertions(+), 7 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/cpp0x/decltype77.C
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index e58d8eb298c..8aaedaefb86 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -14894,11 +14894,11 @@ cp_parser_decltype_expr (cp_parser *parser,
return expr;
}
-/* Parse a `decltype' type. Returns the type.
+/* Parse a `decltype' type. Returns the type.
- simple-type-specifier:
+ decltype-specifier:
decltype ( expression )
- C++14 proposal:
+ C++14:
decltype ( auto ) */
static tree
@@ -14938,10 +14938,18 @@ cp_parser_decltype (cp_parser *parser)
tree expr = NULL_TREE;
- if (cxx_dialect >= cxx14
- && cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
- /* decltype (auto) */
- cp_lexer_consume_token (parser->lexer);
+ if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO)
+ && cp_lexer_nth_token_is (parser->lexer, 2, CPP_CLOSE_PAREN))
+ {
+ /* decltype (auto) */
+ cp_lexer_consume_token (parser->lexer);
+ if (cxx_dialect < cxx14)
+ {
+ error_at (start_token->location,
+ "%<decltype(auto)%> type specifier is a C++14 extension");
+ expr = error_mark_node;
+ }
+ }
else
{
/* decltype (expression) */
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype77.C
b/gcc/testsuite/g++.dg/cpp0x/decltype77.C
new file mode 100644
index 00000000000..1f987118510
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype77.C
@@ -0,0 +1,10 @@
+// PR c++/96103
+// { dg-do compile { target c++11_only } }
+
+decltype(auto) foo () { return 4; } // { dg-error ".decltype\\(auto\\). type
specifier is a C\\+\\+14 extension" }
+
+void
+bar ()
+{
+ decltype(auto) i = 0; // { dg-error ".decltype\\(auto\\). type specifier is
a C\\+\\+14 extension" }
+}
base-commit: 7126583af5d29235584b51b3b05eeaba2adef024
--
2.26.2