#include <stdio.h>
#define DEFLABEL(name) void *name;
#define LABELED(retType, fName, labelDefs) labelDefs;\
retType fName
#define MKLABEL(name, labelName) name = &&labelName;
LABELED(void, test,
DEFLABEL(test_l1)
DEFLABEL(test_l2)
DEFLABEL(test_l3)) (void *ptr) {
MKLABEL(test_l1, l1);
MKLABEL(test_l2, l2);
MKLABEL(test_l3, l3);
if (ptr)
goto *ptr;
return;
l1:
return;
l2:
return;
l3:
return;
}
int main(void) {
test(0);
test(test_l1);
test(test_l2);
test(test_l3);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIERFRkxBQkVMKG5hbWUpIHZvaWQgKm5hbWU7CgojZGVmaW5lIExBQkVMRUQocmV0VHlwZSwgZk5hbWUsIGxhYmVsRGVmcykgbGFiZWxEZWZzO1wKcmV0VHlwZSBmTmFtZQoKI2RlZmluZSBNS0xBQkVMKG5hbWUsIGxhYmVsTmFtZSkgbmFtZSA9ICYmbGFiZWxOYW1lOwoKTEFCRUxFRCh2b2lkLCB0ZXN0LCAKCURFRkxBQkVMKHRlc3RfbDEpIAoJREVGTEFCRUwodGVzdF9sMikgCglERUZMQUJFTCh0ZXN0X2wzKSkgKHZvaWQgKnB0cikgewoJCglNS0xBQkVMKHRlc3RfbDEsIGwxKTsKCU1LTEFCRUwodGVzdF9sMiwgbDIpOwoJTUtMQUJFTCh0ZXN0X2wzLCBsMyk7CgkKCWlmIChwdHIpCiAgICAJZ290byAqcHRyOwogICAgcmV0dXJuOwpsMToKICAgIHByaW50ZigidGVzdDFcbiIpOwogICAgcmV0dXJuOwpsMjoKICAgIHByaW50ZigidGVzdDJcbiIpOwogICAgcmV0dXJuOwpsMzoKICAgIHByaW50ZigidGVzdDNcbiIpOwogICAgcmV0dXJuOwp9CgppbnQgbWFpbih2b2lkKSB7Cgl0ZXN0KDApOwoJdGVzdCh0ZXN0X2wxKTsKCXRlc3QodGVzdF9sMik7Cgl0ZXN0KHRlc3RfbDMpOwp9Cg==