diff options
author | Marek Polacek <polacek@redhat.com> | 2020-07-08 19:45:34 -0400 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2020-07-17 11:43:39 -0400 |
commit | e7f0873a9c4ebccd078fc5330866efe0cd4c1309 (patch) | |
tree | aa7a95a573fcb4e35b6dfd38f472cb714fa65944 /gcc | |
parent | c08ff9f81914c6028c586e5ecdec3736cd9a4fec (diff) | |
download | gcc-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.c | 17 | ||||
-rw-r--r-- | gcc/cp/pt.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/auto-fn59.C | 8 |
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" } |