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:
Marek Polacek 2020-07-08 19:45:34 -04:00
parent c08ff9f819
commit e7f0873a9c
3 changed files with 27 additions and 4 deletions

View File

@ -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;
}
}
}

View File

@ -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
{

View File

@ -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" }