CIL cannot parse a line containing an empty #pragma.
If your compiler uses pragmas in places other than the top-level, you may have to preprocess the sources in a special way (sed, perl, etc.) to remove pragmas from these locations.
int bar(int ()); // This prototype cannot be parsed int bar(int x()); // If you add a name to the function, it works int bar(int (*)()); // This also works (and it is more appropriate)
g(); // This cannot be parsed int g(); // This is Ok
typedef signed char __s8; __s8 unsigned uchartest; // This is unsigned char for gcc
CIL will assume optimizations are on, and rename your extern inline function (and its uses) with the suffix __extinline. This means that if you have two such definition, that do different things and the optimizations are not on, then the CIL version might compute a different answer !
Also, if you have multiple extern inline declarations then CIL will ignore but the first one. This is not so bad because GCC itself would not like it.
Variable-length arrays are not supported as fields of a struct or union.
mytype x = __builtin_va_arg(marker, mytype)into
mytype x; __builtin_va_arg(marker, sizeof(mytype), &x);
The latter form is used internally in CIL. However, the CIL pretty printer will try to emit the original code.
Similarly, __builtin_types_compatible_p(t1, t2), which takes types as arguments, is represented internally as __builtin_types_compatible_p(sizeof t1, sizeof t2), but the sizeofs are removed when printing.