This is avr-gcc compiled from the git mirror commit fcdd7053da, which says it's SVN trunk@243328.
This code used to work on some earlier GCC, but I don't know which version. Host is Debian Linux, i686, compiled with gcc (Debian 6.2.1-5) 6.2.1 20161124. Configured with: ../gcc/configure --target=avr --enable-languages=c,c++ --enable-shared --with-system-zlib --enable-long-long --disable-nls --disable-libssp --disable-libsanitizer --program-prefix=avr- --with-as=/usr/bin/avr-as --with-ld=/usr/bin/avr-ld $ avr-gcc -gdwarf-4 -Os -mmcu=at90s8515 -c scanf-nul.i scanf-nul.i: In function 'main': scanf-nul.i:130:1: internal compiler error: in maybe_record_trace_start, at dwarf2cfi.c:2328 } ^ 0x837b20c maybe_record_trace_start ../../gcc/gcc/dwarf2cfi.c:2328 0x837b502 create_trace_edges ../../gcc/gcc/dwarf2cfi.c:2424 0x837d412 scan_trace ../../gcc/gcc/dwarf2cfi.c:2638 0x837def9 create_cfi_notes ../../gcc/gcc/dwarf2cfi.c:2664 0x837def9 execute_dwarf2_frame ../../gcc/gcc/dwarf2cfi.c:3022 0x837def9 execute ../../gcc/gcc/dwarf2cfi.c:3502 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. The code is straight out of the avr-libc test suite. The version below has the header spam stripped out. == scanf-nul.i == typedef unsigned int uint8_t __attribute__((__mode__(__QI__))); typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__))); typedef unsigned int size_t; struct __file { char *buf; unsigned char unget; uint8_t flags; int size; int len; int (*put)(char, struct __file *); int (*get)(struct __file *); void *udata; }; typedef struct __file FILE; extern FILE *fdevopen(int (*__put)(char, FILE*), int (*__get)(FILE*)); extern int fclose(FILE *__stream); extern int fscanf(FILE *__stream, const char *__fmt, ...); extern void exit(int __status) __attribute__((__noreturn__)); extern void *memset(void *, int, size_t); extern int memcmp(const void *, const void *, size_t) __attribute__((__pure__)); int vrslt = 1; struct { int i; int j; char s[8]; char t[8]; } v = { 1, 1, {1}, {1} }; const char *getpnt, *getend; int ugetc(FILE *fp) { (void)fp; if (getpnt == getend) return -2; return *getpnt++; } int uread(void *cookie, char *buf, size_t size) { size_t n; for (n = 0; n < size; n++) { int i = ugetc(cookie); if (i < 0) break; *buf++ = i; } return n; } int uclose (void *cookie) { (void)cookie; return 0; } static FILE * uopen(const char *buf, int size) { static FILE *fp; if (fp) fclose(fp); fp = fdevopen(0, ugetc); if (!fp) exit(117); getpnt = buf; getend = buf + size; return fp; } int main() { FILE *fp; int i; memset(&v, ~0, sizeof v); fp = uopen("A\000B", 3); vrslt = fscanf(fp, "%c%c%c", v.s, v.s + 1, v.s + 2); if (vrslt != 3) exit(133); if(memcmp(v.s, "A\000B", 3)) exit(134); memset(&v, ~0, sizeof v); fp = uopen("\t \000", 3); i = fscanf(fp, " %c", v.s); if (i != 1) exit(140); if (v.s[0]) exit(141); memset(&v, ~0, sizeof v); fp = uopen("123\000456", 7); i = fscanf(fp, "%d%c%d", &v.i, v.s, &v.j); if (i != 3) exit(147); if (v.i != 123 || v.s[0] || v.j != 456) exit(148); memset(&v, ~0, sizeof v); fp = uopen("A\000BC", 4); i = fscanf(fp, "%s%s", v.s, v.t); if (i != 1) exit(154); if (memcmp(v.s, "A\000BC", 4)) exit(155); return 0; }