This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/77388] Reference to a packed structure member


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

--- Comment #4 from rguenther at suse dot de <rguenther at suse dot de> ---
On Fri, 26 Aug 2016, andre.simoesdiasvieira at arm dot com wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77388
> 
> --- Comment #3 from Andre Vieira <andre.simoesdiasvieira at arm dot com> ---
> Thank you Richard!
> 
> I have a follow up question. Why is this only a problem when passing by
> reference and not when passing a pointer?
> 
> So say:
> #define PACKED __attribute__ ((packed))
> 
> #define TYPE_C short
> 
> typedef struct {
>     TYPE_C c;
> } PACKED test_struct;
> 
> class A
> {
>   const TYPE_C * c;
> public:
>   A (const TYPE_C * _c) :
>     c(_c) {};
> };
> 
> class B
> {
> public:
>   B();
>   A foo ();
> private:
>   test_struct * s;
> };
> 
> A B::foo ()
> {
>   return A (&(s->c));
> }
> 
> Wouldn't there still be an alignment mismatch between A::c and s->c?

Yes, this still invokes undefined behavior.  You just don't get bitten
by the C++ FE choosing to use a temporary for the const reference.
I suppose using a non-const reference would "work" as well.

Note the above is also not diagnosed.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]