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.
2026-02-05 Jakub Jelinek <jakub@redhat.com>
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.
--- /dev/null
+// 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;
+}
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);