#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 )? &&GT_(true): &&GT_(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;
}