On Mon, 30 Mar 2026, Marek Polacek wrote:
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
>
> -- >8 --
> Here we are emitting a bogus error in get_reflection because it
> got something for which is_auto was true: the constrained auto
> coming from make_constrained_auto.
Could we move the auto check/diagnostic from get_reflection to only
the parser? IIUC the intent of [expr.reflect]/6.1 is to treat
^^auto as invalid syntactically.
> We represent the
> return-type-requirement as a constrained auto which is in fact
> a placeholder, but in this case we don't want the error. In the PR
> Jason suggested doing something to obscure the placeholderness
> across the call to build_concept_check. I think we could rewrite
> the identifier for the build_concept_check call.
>
> PR c++/124457
>
> gcc/cp/ChangeLog:
>
> * cp-tree.h (make_generic_type_name): Declare.
> * parser.cc (make_generic_type_name): No longer static.
> * pt.cc (make_constrained_placeholder_type): Use
> make_generic_type_name to temporarily obfuscate the name.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/reflect/concept1.C: New test.
> ---
> gcc/cp/cp-tree.h | 1 +
> gcc/cp/parser.cc | 2 +-
> gcc/cp/pt.cc | 5 +++++
> gcc/testsuite/g++.dg/reflect/concept1.C | 14 ++++++++++++++
> 4 files changed, 21 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/g++.dg/reflect/concept1.C
>
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index ea3cb049785..333dc56551a 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -8046,6 +8046,7 @@ extern bool literal_integer_zerop (const_tree);
> extern tree attr_chainon (tree, tree);
> extern tree maybe_add_dummy_lambda_op (tree);
> extern void remove_dummy_lambda_op (tree, tree);
> +extern tree make_generic_type_name ();
>
> /* in pt.cc */
> extern tree canonical_type_parameter (tree);
> diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
> index 8d88dc9c312..f7e254e8f7c 100644
> --- a/gcc/cp/parser.cc
> +++ b/gcc/cp/parser.cc
> @@ -57485,7 +57485,7 @@ c_parse_file (void)
> template parameter implied by `auto' or a concept identifier). */
>
> static GTY(()) int generic_parm_count;
> -static tree
> +tree
> make_generic_type_name ()
> {
> char buf[32];
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 020a70c1112..b4ba7d150e0 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -30941,7 +30941,12 @@ make_constrained_placeholder_type (tree type, tree
> con, tree args)
> /* Build the constraint. */
> tree tmpl = DECL_TI_TEMPLATE (con);
> ++processing_template_decl;
> + tree old_name = TYPE_IDENTIFIER (type);
> + /* Temporarily obfuscate the name so that we don't emit the "placeholder
> + type" error when taking the reflection of this constrained auto. */
> + TYPE_IDENTIFIER (type) = make_generic_type_name ();
> tree expr = build_concept_check (tmpl, type, args, tf_warning_or_error);
> + TYPE_IDENTIFIER (type) = old_name;
> --processing_template_decl;
>
> PLACEHOLDER_TYPE_CONSTRAINTS_INFO (type)
> diff --git a/gcc/testsuite/g++.dg/reflect/concept1.C
> b/gcc/testsuite/g++.dg/reflect/concept1.C
> new file mode 100644
> index 00000000000..88121f20d01
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/reflect/concept1.C
> @@ -0,0 +1,14 @@
> +// PR c++/124457
> +// { dg-do compile { target c++26 }
> +// { dg-additional-options "-freflection" }
> +
> +template <class T, auto t = ^^T>
> +concept True = true;
> +
> +template <class T>
> +concept AlsoTrue = requires (T t) {
> + { t } -> True;
> +};
> +void f1(True auto x);
> +template <True T> void f2(T );
> +auto f3(int) -> True auto;
>
> base-commit: 2c1a819254cc892877014169f99edce7eaced66f
> --
> 2.53.0
>
>