On Fri, 6 Feb 2026, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase ICEs in -std=c++26 mode since my r16-4338 C++26
> va_start changes.
> The problem is that if we have anything non-canonical in a function
> type with (...) in C++26 (or C23/C2Y) mode, in this case the R typedef
> on return type rather than void, then we try to build TYPE_CANONICAL
> for that, but weren't passing in the no_named_args_stdarg_p, so
> a type with TYPE_NO_NAMED_ARGS_STDARG_P flag set got TYPE_CANONICAL
> with TYPE_NO_NAMED_ARGS_STDARG_P flag cleared and comptypes then
> didn't like that as those aren't really compatible types
> (...) vs. the C89-ish () which even C++ uses for some type-generic
> etc. builtins.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

> 2026-02-05  Jakub Jelinek  <[email protected]>
> 
>       PR c++/123977
>       * tree.cc (build_function_type): Pass no_named_args_stdarg_p
>       as last argument to recursive call.
> 
>       * g++.dg/cpp26/stdarg10.C: New test.
> 
> --- gcc/tree.cc.jj    2026-02-05 15:53:47.603157855 +0100
> +++ gcc/tree.cc       2026-02-05 16:51:48.511416898 +0100
> @@ -7780,7 +7780,8 @@ build_function_type (tree value_type, tr
>      gcc_assert (TYPE_STRUCTURAL_EQUALITY_P (t));
>    else if (any_noncanonical_p)
>      TYPE_CANONICAL (t) = build_function_type (TYPE_CANONICAL (value_type),
> -                                           canon_argtypes);
> +                                           canon_argtypes,
> +                                           no_named_args_stdarg_p);
>  
>    if (!COMPLETE_TYPE_P (t))
>      layout_type (t);
> --- gcc/testsuite/g++.dg/cpp26/stdarg10.C.jj  2026-02-05 16:56:58.543182179 
> +0100
> +++ gcc/testsuite/g++.dg/cpp26/stdarg10.C     2026-02-05 16:56:41.575468671 
> +0100
> @@ -0,0 +1,19 @@
> +// PR c++/123977
> +// { dg-do compile }
> +
> +typedef void R;
> +struct A {
> +  R foo (...) const volatile;
> +  void foo ();
> +};
> +
> +template <class T>
> +struct B {
> +  static void bar () { (T (A::*)) &A::foo; }
> +};
> +
> +void
> +baz ()
> +{
> +  B <R (...) const volatile>::bar;
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to