http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57653
--- Comment #15 from Allan McRae <allan at archlinux dot org> --- with -ffreestanding LC_ENTER "foo.c" LC_RENAME "<command-line>" LC_ENTER "foo.h" LC_LEAVE 0x0 LC_RENAME "foo.c" <- correct output printed here LC_LEAVE 0x0 so std-predef.h is not included. I tried with -include foo.h and a breakpoint in push_command_line_include... I just stepped through from that breakpoint and saw cpp_push_default_include being called for both stdc-predef.h and foo.h. That also gives the correct output. # gcc-4.9 -include foo.h foo.c foo.c: In function ‘main’: foo.c:1:21: error: expected expression before ‘}’ token int main() { return }