On Fri, Jul 5, 2024 at 1:50 PM Patrick Palka <ppa...@redhat.com> wrote:
>
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
> OK for trunk/14?
>
> -- >8 --
>
> During the alias CTAD transformation, if substitution failed for some
> guide we should just discard the guide silently.  We currently do
> discard the guide, but not silently, which causes us to reject the
> below testcase due to forming a too-large array type when transforming
> the user-defined deduction guides.
>
> This patch fixes this by passing complain=tf_none instead of
> =tf_warning_or_error in the couple of spots where we expect subsitution
> to possibly fail and so subsequently check for error_mark_node.

Ping.  Alternatively we could set complain=tf_none everywhere.

>
>         PR c++/115296
>
> gcc/cp/ChangeLog:
>
>         * pt.cc (alias_ctad_tweaks): Pass complain=tf_none to
>         tsubst_decl and tsubst_constraint_info.
>
> gcc/testsuite/ChangeLog:
>
>         * g++.dg/cpp2a/class-deduction-alias23.C: New test.
> ---
>  gcc/cp/pt.cc                                  |  4 ++--
>  .../g++.dg/cpp2a/class-deduction-alias23.C    | 20 +++++++++++++++++++
>  2 files changed, 22 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C
>
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index d1316483e24..a382dce8788 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -30451,7 +30451,7 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
>               /* Parms are to have DECL_CHAIN tsubsted, which would be skipped
>                  if cp_unevaluated_operand.  */
>               cp_evaluated ev;
> -             g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain,
> +             g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, tf_none,
>                                /*use_spec_table=*/false);
>             }
>           if (g == error_mark_node)
> @@ -30478,7 +30478,7 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
>             {
>               if (tree outer_targs = outer_template_args (f))
>                 ci = tsubst_constraint_info (ci, outer_targs, complain, 
> in_decl);
> -             ci = tsubst_constraint_info (ci, targs, complain, in_decl);
> +             ci = tsubst_constraint_info (ci, targs, tf_none, in_decl);
>             }
>           if (ci == error_mark_node)
>             continue;
> diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C 
> b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C
> new file mode 100644
> index 00000000000..e5766586761
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C
> @@ -0,0 +1,20 @@
> +// PR c++/115296
> +// { dg-do compile { target c++20 } }
> +
> +using size_t = decltype(sizeof(0));
> +
> +template<class T, size_t N = -1ULL>
> +struct span { span(T); };
> +
> +template<class T, size_t N>
> +span(T(&)[N]) -> span<T, N>; // { dg-bogus "array exceeds maximum" }
> +
> +template<class T, size_t N>
> +requires (sizeof(T(&)[N]) != 42) // { dg-bogus "array exceeds maximum" }
> +span(T*) -> span<T, N>;
> +
> +template<class T>
> +using array_view = span<T>;
> +
> +span x = 0;
> +array_view y = 0;
> --
> 2.45.2.746.g06e570c0df
>

Reply via email to