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;
}

Reply via email to