https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91031

            Bug ID: 91031
           Summary: wrong code generated when using compound literal
           Product: gcc
           Version: 9.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: crigler at users dot sourceforge.net
  Target Milestone: ---

typedef long unsigned int size_t;
void abort (void);
int strcmp(const char *a, const char *b);
size_t strlen (const char *__s);

typedef struct
{
        size_t size;
        const char *buffer;
} String;

void testme(const String *s)
{
        if (s->size != strlen("testme"))
                abort();
        if (strcmp(s->buffer, "testme") != 0)
                abort();
}

int main()
{
        const String *s = (void *)0;

        if (!s)
        {
                s = &(const String){.buffer = "testme", .size =
strlen("testme")};
        }
        testme(s);
}

Using GCC 9, s is left uninitialized when testme is called:

$ gcc-9.1 -O2 g.c; ./a.out
Aborted

Reply via email to