The following program seems to show a
compiler bug on x86 using 4.3.2 compilers

The correct output should be;

  giChannelTiming0.Setup 0xff
  giChannelTiming0.Recover 0xff000000

which occurs only when no optimiser or -O is used.

When -O2 or greater is used the mask's are incorrectly
computed and print as 0.

It is known also not to work on 4.1.2 compilers.

It works perfectly with all optimisation levels on 3.2.3
compilers.

/* ---- */

#include <stdio.h>
#include <sys/param.h>

typedef struct giChannelTiming {
#if BYTE_ORDER == BIG_ENDIAN
  /* Bits 24..31 */ unsigned Recover : 8 ;
  /* Bits 16..23 */ unsigned Hold : 8 ;
  /* Bits  8..15 */ unsigned Pulse : 8 ;
  /* Bits  0.. 7 */ unsigned Setup : 8 ;
#else
  /* Bits  0.. 7 */ unsigned Setup : 8 ;
  /* Bits  8..15 */ unsigned Pulse : 8 ;
  /* Bits 16..23 */ unsigned Hold : 8 ;
  /* Bits 24..31 */ unsigned Recover : 8 ;
#endif

 giChannelTiming(long l = 0) { *(unsigned long *)this=l; }
 operator unsigned long *(void) { return((unsigned long *)this) ; }
 operator unsigned long (void) { return(*(unsigned long *)this) ; }
} t_giChannelTiming ;

#define FIO_LOCATED(n) 0
#define ID_GEN_giChannelTiming0Setup 0
#define ID_GEN_giChannelTiming0Recover 0

#define GI_REG_F(field,reg) { #reg "." #field, ID_GEN_##reg##field, \
   { FIO_LOCATED(reg), (gr.reg=0, gr.reg.field =~0, (unsigned long)gr.reg)}}

struct gen_registers {
 t_giChannelTiming giChannelTiming0;
} ;

static gen_registers gr ;

struct regs {
          const char *name ;
          int id ;
          struct masks {
                  int locn ;
                  unsigned long mask ;
          } s ;
        } r[] = {
                GI_REG_F(Setup, giChannelTiming0),
                GI_REG_F(Recover, giChannelTiming0)
} ;

main() {
 printf("%s 0x%lx\n", r[0].name, r[0].s.mask);
 printf("%s 0x%lx\n", r[1].name, r[1].s.mask);
}

/* --------- */


-- 
           Summary: C++ bitfield static initialisation problem
           Product: gcc
           Version: 4.3.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: john dot spelis at 3dlabs dot com
 GCC build triplet: i386-redhat-linux
  GCC host triplet: i386-redhat-linux
GCC target triplet: i386-redhat-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38818

Reply via email to