[Bug c++/45510] Bug with anonymous unions and bit-fields

2010-09-03 Thread runipg at broadcom dot com


--- Comment #9 from runipg at broadcom dot com  2010-09-03 14:45 ---
Subject: Re:  Bug with anonymous unions and bit-fields

Thank you so much. You can close this bug if you wish.


-Runip

On 03-Sep-2010, at 3:47 AM, paolo dot carlini at oracle dot com
gcc-bugzi...@gcc.gnu.org wrote:

 
 
 --- Comment #8 from paolo dot carlini at oracle dot com  2010-09-03 10:46 
 ---
 If you look at the actual Standard, both alignment and allocation of 
 bit-fields
 are implementation defined. Thus, as far as I can see, at best we are talking
 about non-portable implementation defined behavior. If you want my advice, try
 to stay away from those tricks, with and without anonymous struct.
 
 
 -- 
 
 
 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45510
 
 --- You are receiving this mail because: ---
 You reported the bug, or are watching the reporter.
 


-- 


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



[Bug c++/45510] Bug with anonymous unions and bit-fields

2010-09-03 Thread runipg at broadcom dot com


--- Comment #10 from runipg at broadcom dot com  2010-09-03 19:19 ---
Subject: Re:  Bug with anonymous unions and bit-fields

Your suggestion works:

struct bfc {
  union {
struct {
  unsigned int a : 1,
 b : 4;
};
unsigned int data;
  };
};

void
testc()
{
   cout  __func__  endl;

   bfc bf0;
   bf0.data = 0;

   cout  bf0.data=  hex  bf0.data  endl;
   cout  bf0.a=  bf0.a  endl;
   cout  bf0.b=  bf0.b  endl;

   bf0.a = 1;

   cout  bf0.data=  hex  bf0.data  endl;
   cout  bf0.a=  bf0.a  endl;
   cout  bf0.b=  hex  bf0.b  endl;

   bf0.b = 1;

   cout  bf0.data=  hex  bf0.data  endl;
   cout  bf0.a=  bf0.a  endl;
   cout  bf0.b=  hex  bf0.b  endl;
}

Output is 

testc
bf0.data=0
bf0.a=0
bf0.b=0
bf0.data=1
bf0.a=1
bf0.b=0
bf0.data=3
bf0.a=1
bf0.b=1
---

I guess the fundamental issue which confused me was:

struct bfa {
  union {
unsigned int a : 1,
   b : 4;
unsigned int data;
  };
};

that it appeared to be a union of 2 integers (one bit-field) rather than 
the implementation version where the union is of 3 integers 
(two-bitfields).  If the standard does not say anything specific about 
it, then I guess the compiler is free to do whatever it wants.

In fact, I tried a slight variation on bfa, where I tried to force 
alignment on the first integer packing.

struct bfd {
  union {
unsigned int a : 1,
   b : 4,
   : 0;   //force alignment
unsigned int data;
  };
};

However this gives the same result as bfa.

So I guess semantically it is very confusing to a user. Perhaps this 
part of the language should be tightened.

Thanks Paolo!

-Runip

paolo dot carlini at oracle dot com wrote:
 --- Comment #8 from paolo dot carlini at oracle dot com  2010-09-03 10:46 
 ---
 If you look at the actual Standard, both alignment and allocation of 
 bit-fields
 are implementation defined. Thus, as far as I can see, at best we are talking
 about non-portable implementation defined behavior. If you want my advice, try
 to stay away from those tricks, with and without anonymous struct.


   


-- 


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



[Bug c++/45510] Bug with anonymous unions and bit-fields

2010-09-03 Thread runipg at broadcom dot com


--- Comment #12 from runipg at broadcom dot com  2010-09-03 21:12 ---
Subject: Re:  Bug with anonymous unions and bit-fields

Okay, I guess I was confused by struct or union semantics. Thanks!


jakub at gcc dot gnu dot org wrote:
 --- Comment #11 from jakub at gcc dot gnu dot org  2010-09-03 20:53 
 ---
 I don't see anything confusing about it.  If you have:
 union { int a, b, c; } u;
 u.a overlaps u.b and u.c as well, and the same applies to bitfields.  union
 isn't struct, see ISO C99 6.7.2.1/5.  The standard is clear on this.


   


-- 


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



[Bug c++/45510] Bug with anonymous unions and bit-fields

2010-09-02 Thread runipg at broadcom dot com


--- Comment #3 from runipg at broadcom dot com  2010-09-03 01:03 ---
Subject: Re:  Bug with anonymous unions and bit-fields

That was fast and interesting that two other compilers behave the same. 
Unfortunately I don't have access to any other compiler.  I am simply 
befuddled by the behavior though. I wouldn't file a bug, if I thought it 
was frivolous.

paolo dot carlini at oracle dot com wrote:
 --- Comment #2 from paolo dot carlini at oracle dot com  2010-09-03 00:02 
 ---
 Without having seriously looked into your code, I note that two completely
 different, closed source compilers (ICC and SunStudio) leads to the same
 behavior as GCC at runtime. Does your code actually work (behaves like you
 expect) somewhere?


   


-- 


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



[Bug c++/45510] Bug with anonymous unions and bit-fields

2010-09-02 Thread runipg at broadcom dot com


--- Comment #7 from runipg at broadcom dot com  2010-09-03 03:31 ---
Subject: Re:  Bug with anonymous unions and bit-fields

Wow, So there is a diff inside and outside a struct? 

This is very counter-intuitive but I am  to accept your explanation if that's
what the language says. 

Thanks so much for looking into it and responding. Sorry if it is not a bug, I
googled for anything similar before filing it.

-Runip

On 02-Sep-2010, at 6:11 PM, pinskia at gcc dot gnu dot org
gcc-bugzi...@gcc.gnu.org wrote:

 
 
 --- Comment #5 from pinskia at gcc dot gnu dot org  2010-09-03 01:10 
 ---
  union {
unsigned int a : 1,
   b : 4;
unsigned int data;
  };
 
 
 This is an union of three elements each over lapping, that is a:1 overlaps 
 with
 b:4 and data.  So this is expected behavior as far as I can tell.
 
 
 -- 
 
 
 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45510
 
 --- You are receiving this mail because: ---
 You reported the bug, or are watching the reporter.
 


-- 


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