On Fri, May 17, 2024 at 12:05:15PM -0400, Patrick Palka wrote:
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> trunk/14?

This patch looks good to me, thanks.
 
> -- >8 --
> 
> After the tsubst_copy removal r14-4796-g3e3d73ed5e85e7 GCC 14 ICEs during
> fold_non_dependent_expr for 'e1 | e2' ultimately because we no longer exit
> early when substituting the CONST_DECLs for e1 and e2 with args=NULL_TREE,
> during which we try substituting the class context A<Ts...> (also with
> args=NULL_TREE) which ends up ICEing from tsubst_pack_expansion (due to
> processing_template_decl being cleared).
> 
> Incidentally, the ICE went away on trunk ever since the tsubst_aggr_type
> removal r15-123-gf04dc89a991ddc since it made the CONST_DECL case of
> tsubst_expr use tsubst to substitute the context, which does short circuit
> for empty args and so avoids the ICE.
> 
> This patch fixes this ICE for GCC 14 by narrowly restoring the early exit
> for empty args that was present in tsubst_copy when substituting an
> enumerator CONST_DECL.  We might as well apply this to trunk too, as a
> very minor optimization.
> 
>       PR c++/115139
> 
> gcc/cp/ChangeLog:
> 
>       * pt.cc (tsubst_expr) <case CONST_DECL>: Exit early if args
>       is empty.
> 
> gcc/testsuite/ChangeLog:
> 
>       * g++.dg/template/non-dependent33.C: New test.
> ---
>  gcc/cp/pt.cc                                    |  2 +-
>  gcc/testsuite/g++.dg/template/non-dependent33.C | 11 +++++++++++
>  2 files changed, 12 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/template/non-dependent33.C
> 
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 32640f8e946..e185e3d8941 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -21519,7 +21519,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t 
> complain, tree in_decl)
>  
>       if (DECL_TEMPLATE_PARM_P (t))
>         RETURN (RECUR (DECL_INITIAL (t)));
> -     if (!uses_template_parms (DECL_CONTEXT (t)))
> +     if (!args || !uses_template_parms (DECL_CONTEXT (t)))
>         RETURN (t);
>  
>       /* Unfortunately, we cannot just call lookup_name here.
> diff --git a/gcc/testsuite/g++.dg/template/non-dependent33.C 
> b/gcc/testsuite/g++.dg/template/non-dependent33.C
> new file mode 100644
> index 00000000000..2f1dd8a214c
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/non-dependent33.C
> @@ -0,0 +1,11 @@
> +// PR c++/115139
> +// { dg-do compile { target c++11 } }
> +
> +template<class... Ts>
> +class A {
> +  enum E {
> +    e1 = 1,
> +    e2 = 2,
> +    e3 = e1 | e2,
> +  };
> +};
> -- 
> 2.45.1.204.gd8ab1d464d
> 

Marek

Reply via email to