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.
This commit is contained in:
parent
c08ff9f819
commit
e7f0873a9c
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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" }
|
Loading…
Reference in New Issue