This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/38818] New: C++ bitfield static initialisation problem
- From: "john dot spelis at 3dlabs dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 12 Jan 2009 20:53:06 -0000
- Subject: [Bug c++/38818] New: C++ bitfield static initialisation problem
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
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