Thread overview
How to use core.vararg to print D variadic arguments and their types without using ! (template instantiation)?
Sep 14
BoQsc
Sep 15
Basile B.
Sep 18
BoQsc
September 14

https://dlang.org/phobos/core_vararg.html

The common way to use va_arg is va_arg!(int)(_argptr);
What would be the alternative way or syntax that behave exactly the same way, even if more verbose?


va_arg!(int)(_argptr); is taken from an example in:
https://dlang.org/spec/function.html#d_style_variadic_functions

September 15

On Thursday, 14 September 2023 at 15:19:29 UTC, BoQsc wrote:

>

https://dlang.org/phobos/core_vararg.html

The common way to use va_arg is va_arg!(int)(_argptr);
What would be the alternative way or syntax that behave exactly the same way, even if more verbose?


va_arg!(int)(_argptr); is taken from an example in:
https://dlang.org/spec/function.html#d_style_variadic_functions

here's how

import core.vararg;

void main()
{
    foo(.5, 5);
}

void foo(...)
{
    int i = void;
    va_arg(_argptr, typeid(i), &i);
    assert(i == 5);
    double d = void;
    va_arg(_argptr, typeid(d), &d);
    assert(d == .5);
}
September 16

On 9/15/23 4:14 PM, Basile B. wrote:

>

On Thursday, 14 September 2023 at 15:19:29 UTC, BoQsc wrote:

>

https://dlang.org/phobos/core_vararg.html

The common way to use va_arg is va_arg!(int)(_argptr);
What would be the alternative way or syntax that behave exactly the same way, even if more verbose?


va_arg!(int)(_argptr); is taken from an example in:
https://dlang.org/spec/function.html#d_style_variadic_functions

here's how

import core.vararg;

void main()
{
     foo(.5, 5);
}

void foo(...)
{
     int i = void;
     va_arg(_argptr, typeid(i), &i);
     assert(i == 5);
     double d = void;
     va_arg(_argptr, typeid(d), &d);
     assert(d == .5);
}

Note that this doesn't work in gdc.

The templated version is actually more akin to what C does.

-Steve

September 18
>

Note that this doesn't work in gdc.

The templated version is actually more akin to what C does.

Yeah it does not seem to work in gdc when tested using https://d.godbolt.org/

The errors produced:

<source>:11:12: error: none of the overloads of template 'core.stdc.stdarg.va_arg' are callable using argument types '!()(__va_list_tag[1], TypeInfo, int*)'
   11 |      va_arg(_argptr, typeid(i), &i);
      |            ^
/opt/compiler-explorer/gcc-trunk-20230917/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:179:7: note: Candidates are: 'va_arg(T)(ref va_list ap)'
  179 |     T va_arg(T)(ref va_list ap); // intrinsic
      |       ^
/opt/compiler-explorer/gcc-trunk-20230917/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:291:10: note:                 'va_arg(T)(ref va_list ap, ref T parmn)'
  291 |     void va_arg(T)(ref va_list ap, ref T parmn); // intrinsic
      |          ^
<source>:14:12: error: none of the overloads of template 'core.stdc.stdarg.va_arg' are callable using argument types '!()(__va_list_tag[1], TypeInfo, double*)'
   14 |      va_arg(_argptr, typeid(d), &d);
      |            ^
/opt/compiler-explorer/gcc-trunk-20230917/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:179:7: note: Candidates are: 'va_arg(T)(ref va_list ap)'
  179 |     T va_arg(T)(ref va_list ap); // intrinsic
      |       ^
/opt/compiler-explorer/gcc-trunk-20230917/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:291:10: note:                 'va_arg(T)(ref va_list ap, ref T parmn)'
  291 |     void va_arg(T)(ref va_list ap, ref T parmn); // intrinsic
      |          ^
ASM generation compiler returned: 1
<source>:11:12: error: none of the overloads of template 'core.stdc.stdarg.va_arg' are callable using argument types '!()(__va_list_tag[1], TypeInfo, int*)'
   11 |      va_arg(_argptr, typeid(i), &i);
      |            ^
/opt/compiler-explorer/gcc-trunk-20230918/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:179:7: note: Candidates are: 'va_arg(T)(ref va_list ap)'
  179 |     T va_arg(T)(ref va_list ap); // intrinsic
      |       ^
/opt/compiler-explorer/gcc-trunk-20230918/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:291:10: note:                 'va_arg(T)(ref va_list ap, ref T parmn)'
  291 |     void va_arg(T)(ref va_list ap, ref T parmn); // intrinsic
      |          ^
<source>:14:12: error: none of the overloads of template 'core.stdc.stdarg.va_arg' are callable using argument types '!()(__va_list_tag[1], TypeInfo, double*)'
   14 |      va_arg(_argptr, typeid(d), &d);
      |            ^
/opt/compiler-explorer/gcc-trunk-20230918/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:179:7: note: Candidates are: 'va_arg(T)(ref va_list ap)'
  179 |     T va_arg(T)(ref va_list ap); // intrinsic
      |       ^
/opt/compiler-explorer/gcc-trunk-20230918/lib/gcc/x86_64-linux-gnu/14.0.0/include/d/core/stdc/stdarg.d:291:10: note:                 'va_arg(T)(ref va_list ap, ref T parmn)'
  291 |     void va_arg(T)(ref va_list ap, ref T parmn); // intrinsic
      |          ^
Execution build compiler returned: 1