c++: Don't allow type-constraint auto(x) [PR104752]

104752 points out that

  template<class T>
  concept C = true;
  auto y = C auto(1);

is ill-formed as per [dcl.type.auto.deduct]: "For an explicit type conversion,
T is the specified type, which shall be auto." which doesn't allow
type-constraint auto.

	PR c++/104752

gcc/cp/ChangeLog:

	* semantics.cc (finish_compound_literal): Disallow auto{x} for
	is_constrained_auto.
	* typeck2.cc (build_functional_cast_1): Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp23/auto-fncast12.C: New test.
This commit is contained in:
Marek Polacek 2022-03-02 12:12:33 -05:00
parent ac8310dd12
commit 97f76b5fc4
3 changed files with 22 additions and 2 deletions

View File

@ -3150,7 +3150,13 @@ finish_compound_literal (tree type, tree compound_literal,
&& !AUTO_IS_DECLTYPE (type)
&& CONSTRUCTOR_NELTS (compound_literal) == 1)
{
if (cxx_dialect < cxx23)
if (is_constrained_auto (type))
{
if (complain & tf_error)
error ("%<auto{x}%> cannot be constrained");
return error_mark_node;
}
else if (cxx_dialect < cxx23)
pedwarn (input_location, OPT_Wc__23_extensions,
"%<auto{x}%> only available with "
"%<-std=c++2b%> or %<-std=gnu++2b%>");

View File

@ -2308,7 +2308,13 @@ build_functional_cast_1 (location_t loc, tree exp, tree parms,
&& list_length (parms) == 1)
{
init = TREE_VALUE (parms);
if (cxx_dialect < cxx23)
if (is_constrained_auto (anode))
{
if (complain & tf_error)
error_at (loc, "%<auto(x)%> cannot be constrained");
return error_mark_node;
}
else if (cxx_dialect < cxx23)
pedwarn (loc, OPT_Wc__23_extensions,
"%<auto(x)%> only available with "
"%<-std=c++2b%> or %<-std=gnu++2b%>");

View File

@ -0,0 +1,8 @@
// PR c++/104752
// { dg-do compile { target c++23 } }
template<class T>
concept C = true;
auto x = auto(1); // valid (P0849R8)
auto y = C auto(1); // { dg-error "cannot be constrained" }
auto z = C auto{1}; // { dg-error "cannot be constrained" }