#define MERGE_(a,b) a##b
#define LABEL_(c,d) MERGE_(c, d)
#define GT_(c) LABEL_(c,__LINE__)
#define tIF(a,b,c) \
{ \
void* _tmp; \
_tmp = ( a )? &>_(true): &>_(false); \
goto *_tmp; \
GT_(true) : b; goto GT_(end); \
GT_(false): c; \
GT_(end):; \
}
typedef struct _A { int i; } A;
A* foo1(int i)
{
return (A*)0;
}
double foo2(double f)
{
return f;
}
int main()
{
int shit = 0;
tIF((shit),foo1(0),foo2(0.0));
shit = 1;
tIF((shit),foo1(0),foo2(0.0));
return 0;
}
I2RlZmluZSBNRVJHRV8oYSxiKSAgYSMjYgojZGVmaW5lIExBQkVMXyhjLGQpIE1FUkdFXyhjLCBkKQojZGVmaW5lIEdUXyhjKSBMQUJFTF8oYyxfX0xJTkVfXykKCiNkZWZpbmUgdElGKGEsYixjKSBcCnsgXAogIHZvaWQqIF90bXA7IFwKICBfdG1wID0gKCBhICk/ICYmR1RfKHRydWUpOiAmJkdUXyhmYWxzZSk7IFwKICBnb3RvICpfdG1wOyBcCiAgICBHVF8odHJ1ZSkgOiBiOyBnb3RvIEdUXyhlbmQpOyBcCiAgICBHVF8oZmFsc2UpOiBjOyBcCiAgR1RfKGVuZCk6OyBcCn0KCgp0eXBlZGVmIHN0cnVjdCBfQSB7IGludCBpOyB9IEE7CiAKQSogZm9vMShpbnQgaSkKewogICAgcmV0dXJuIChBKikwOwp9CiAKZG91YmxlIGZvbzIoZG91YmxlIGYpCnsKICAgIHJldHVybiBmOwp9CgppbnQgbWFpbigpCnsKCiAgICBpbnQgc2hpdCA9IDA7CiAgICB0SUYoKHNoaXQpLGZvbzEoMCksZm9vMigwLjApKTsKICAgIHNoaXQgPSAxOwogICAgdElGKChzaGl0KSxmb28xKDApLGZvbzIoMC4wKSk7CiAgICByZXR1cm4gMDsKfQ==