aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2020-07-08 19:45:34 -0400
committerMarek Polacek <polacek@redhat.com>2020-07-17 11:43:39 -0400
commite7f0873a9c4ebccd078fc5330866efe0cd4c1309 (patch)
treeaa7a95a573fcb4e35b6dfd38f472cb714fa65944 /gcc
parentc08ff9f81914c6028c586e5ecdec3736cd9a4fec (diff)
downloadgcc-e7f0873a9c4ebccd078fc5330866efe0cd4c1309.zip
gcc-e7f0873a9c4ebccd078fc5330866efe0cd4c1309.tar.gz
gcc-e7f0873a9c4ebccd078fc5330866efe0cd4c1309.tar.bz2
c++: Diagnose cv-qualified decltype(auto) [PR79815]
"If the placeholder is the decltype(auto) type-specifier, T shall be the placeholder alone." but we weren't detecting "const decltype(auto)". I've just expanded the existing diagnostic detecting "decltype(auto) &" and similar. gcc/cp/ChangeLog: PR c++/79815 * decl.c (grokdeclarator): Detect cv-qual decltype(auto). * pt.c (do_auto_deduction): Likewise. gcc/testsuite/ChangeLog: PR c++/79815 * g++.dg/cpp1y/auto-fn59.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/decl.c17
-rw-r--r--gcc/cp/pt.c6
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/auto-fn59.C8
3 files changed, 27 insertions, 4 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6e4d546..db91b50 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -12250,11 +12250,20 @@ grokdeclarator (const cp_declarator *declarator,
/* Only plain decltype(auto) is allowed. */
if (tree a = type_uses_auto (type))
{
- if (AUTO_IS_DECLTYPE (a) && a != type)
+ if (AUTO_IS_DECLTYPE (a))
{
- error_at (typespec_loc, "%qT as type rather than "
- "plain %<decltype(auto)%>", type);
- return error_mark_node;
+ if (a != type)
+ {
+ error_at (typespec_loc, "%qT as type rather than "
+ "plain %<decltype(auto)%>", type);
+ return error_mark_node;
+ }
+ else if (TYPE_QUALS (type) != TYPE_UNQUALIFIED)
+ {
+ error_at (typespec_loc, "%<decltype(auto)%> cannot be "
+ "cv-qualified");
+ return error_mark_node;
+ }
}
}
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 4e1c77a..defc2a9 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -28993,6 +28993,12 @@ do_auto_deduction (tree type, tree init, tree auto_node,
error ("%qT as type rather than plain %<decltype(auto)%>", type);
return error_mark_node;
}
+ else if (TYPE_QUALS (type) != TYPE_UNQUALIFIED)
+ {
+ if (complain & tf_error)
+ error ("%<decltype(auto)%> cannot be cv-qualified");
+ return error_mark_node;
+ }
}
else
{
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn59.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn59.C
new file mode 100644
index 0000000..8f6ec9b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn59.C
@@ -0,0 +1,8 @@
+// PR c++/79815
+// { dg-do compile { target c++14 } }
+
+decltype(auto) const x = 1; // { dg-error "cannot be cv-qualified" }
+volatile decltype(auto) x2 = 1; // { dg-error "cannot be cv-qualified" }
+const volatile decltype(auto) x3 = 1; // { dg-error "cannot be cv-qualified" }
+const decltype(auto) fn() { return 42; } // { dg-error "cannot be cv-qualified" }
+const decltype(auto) fn2(); // { dg-error "cannot be cv-qualified" }