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.

Reply via email to