If you move the structure and union names to the beginning, like this, then the problem goes away. Of course, this might work more easily if you were compiling in C++
typedef struct t_GTD
{
union u {
struct ellipse {
t_V2D intercept;
} ;
struct torus {
double Q2;
double W2;
} ;
struct lor {
double c0;
double c1;
double c2;
double c3;
} ;
} ;
} t_GTD;
case=4514