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

            Bug ID: 71560
           Summary: union compound literal initializes wrong union field
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

Consider test.c:
...
#include <stdio.h>

union u { int c; float f; };

int
main (void)
{
  float f = 2.0;
  union u u;
  u = (union u){f};
  printf ("%f\n", u.f);

  return 0;
}
...

This gives the result:
...
$ gcc test.c 
$ ./a.out 
0.000000
...

Here ( https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html ) I read:
...
Compound literals for scalar types and union types are also allowed, but then
the compound literal is equivalent to a cast.
...

So I'd expect the outcome to be the same as for:
...
#include <stdio.h>

union u { int c; float f; };

int
main (void)
{
  float f = 2.0;
  union u u;
  u = (union u)f;
  printf ("%f\n", u.f);

  return 0;
}
...

and that gives the expected:
...
$ gcc test.c
$ ./a.out 
2.000000
...

AFAICT, the problem is introduced by the front-end, which interprets union init
as initializing the int rather than the float field:
...
{
  float f = 2.0e+0;
  union u u;

    float f = 2.0e+0;
    union u u;
  u = <<< Unknown tree: compound_literal_expr
    union u D.2241 = {.c=(int) f}; >>>;
  printf ((const char * restrict) "%f\n", (double) u.f);
  return 0;
}
return 0;
...

Reply via email to