https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110866
Bug ID: 110866 Summary: No UDC lookup with va_arg Product: gcc Version: 13.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jengelh at inai dot de Target Milestone: --- Bugtype: enhancement Version: 13.1.1 20230720 [revision 9aac37ab8a7b919a89c6d64bc7107a8436996e93] (SUSE Linux) Input ===== #include <cstdarg> struct va_wrap { ~va_wrap() { if (engaged) va_end(vl); } va_list vl; operator va_list &() { return vl; } bool engaged = false; }; void f(const char *fmt, ...) { va_wrap va; va_start(va, fmt); va.engaged = 1; va_arg(va, int); if (0) va_copy(va, va); if (0) va_end(va); } int main() { f("", 42); } Observed output =============== $ g++ -c x.cpp x.cpp:12:20: error: first argument to ‘va_arg’ not of type ‘va_list’ Expected output =============== Succeed. If va_start and va_end can take a va_wrap and have the user-defined conversion operator invoked, surely va_arg could do so too.