

---

#include <stdarg.h>

struct S {
    int x;
};

static int getX(struct S (*callback)(void)) {
    return callback().x;
}

static void applyCallback(struct S s, void (*callback)(struct S)) {
    callback(s);
}

static struct S makeS(int x, ...) {
    return (struct S){ x };
}

enum E {
    ZERO, ONE, TWO
};

static enum E makeE(int ordinal, ...) {
    return ordinal;
}

struct Args {
    char a1;
    char a2;
    short a3;
    int a4;
    long long a5;
    float a6;
    double a7;
    void* a8;
    unsigned char a9;
    unsigned short a10;
    unsigned int a11;
    unsigned long long a12;
    enum E a13;
    struct S a14;
    void* a15;
};

static struct Args getVarargs(int ignore, ...) {
    va_list args;
    va_start(args, ignore);

    struct Args result = {
        va_arg(args, char),
        va_arg(args, char),
        va_arg(args, short),
        va_arg(args, int),
        va_arg(args, long long),
        va_arg(args, double),
        va_arg(args, double),
        va_arg(args, void*),
        va_arg(args, unsigned char),
        va_arg(args, unsigned short),
        va_arg(args, unsigned int),
        va_arg(args, unsigned long long),
        va_arg(args, enum E),
        va_arg(args, struct S),
        va_arg(args, void*)
    };

    va_end(args);

    return result;
}

static int sum(int first, int second) {
    return first + second;
}
