This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/77388] New: Reference to a packed structure member
- From: "andre.simoesdiasvieira at arm dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 26 Aug 2016 09:01:14 +0000
- Subject: [Bug c++/77388] New: Reference to a packed structure member
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77388
Bug ID: 77388
Summary: Reference to a packed structure member
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: andre.simoesdiasvieira at arm dot com
Target Milestone: ---
As initially reported by Michal on
https://answers.launchpad.net/gcc-arm-embedded/+question/345145 gcc seems to be
showing some weird behavior when it comes to passing a reference to a member in
a packed structure.
I was able to reduce the testcase presented in that launchpad ticket to the
following program:
$cat t.cpp:
#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);
}
Compiling this with
$arm-none-eabi-g++ -mcpu=cortex-m7 -mthumb -S -O1 t.cpp -fdump-tree-optimized
Will yield the following dump:
;; Function A B::foo() (_ZN1B3fooEv, funcdef_no=3, decl_uid=4607, cgraph_uid=3,
symbol_order=3)
A B::foo() (struct B * const this)
{
const short int D.4636;
struct A D.4650;
<bb 2>:
MEM[(struct A *)&D.4650] = &D.4636;
D.4636 ={v} {CLOBBER};
return D.4650;
}
As you can see, it will not load the struct's field.
Changing the 'TYPE_C' define to 'char' will yield the following dump:
;; Function A B::foo() (_ZN1B3fooEv, funcdef_no=3, decl_uid=4607, cgraph_uid=3,
symbol_order=3)
A B::foo() (struct B * const this)
{
struct A D.4649;
struct test_struct * _1;
char * _2;
<bb 2>:
_1 = this_4(D)->s;
_2 = &_1->c;
MEM[(struct A *)&D.4649] = _2;
return D.4649;
}
Now when the type is 'char' it seems to be able to get the fields address.
Can anyone shine some light on this for me? Is referencing a packed structure's
member that is not guaranteed to be aligned (so not char) undefined behavior?