#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:
    printf("test1\n");
    return;
l2:
    printf("test2\n");
    return;
l3:
    printf("test3\n");
    return;
}

int main(void) {
	test(0);
	test(test_l1);
	test(test_l2);
	test(test_l3);
}
