Bug 26670 - attribute((packed)) sometimes not ignored for non-PODs
|
Bug#:
26670
|
Product: gcc
|
Version: 4.1.1
|
|
Host:
|
Target:
|
Build:
|
|
Status: RESOLVED
|
Severity: normal
|
Priority: P3
|
|
Resolution: FIXED
|
Assigned To: jason@gcc.gnu.org
|
Reported By: debian-gcc@lists.debian.org
|
|
Component: c++
|
Target Milestone: 4.2.0
|
|
Summary: attribute((packed)) sometimes not ignored for non-PODs
|
|
Keywords:
|
|
Opened: 2006-03-13 23:11
|
|
Description:
|
Last confirmed: 2006-07-06 03:52
|
Opened: 2006-03-13 23:11
|
[forwarded from http://bugs.debian.org/356548]
Under some circumstances, non-PODs are not properly stripped of their
packedness:
struct nonpod {
nonpod();
};
struct nonpod_pack {
nonpod n;
} __attribute__ ((packed));
struct nonpod_pack2 {
nonpod_pack p;
} __attribute__ ((packed));
gives
foo.cc:6: warning: ignoring packed attribute on unpacked non-POD field 'nonpod
nonpod_pack::n'
nonpod_pack2::p should also have the packedness ignored, since it is a non-POD.
Hmm, it does not warn about non-PODs which contain non-PODS which had been
warned about already.
It's not just a missing warning, it also changes behavior:
int& foo(nonpod_pack& n) {
return n.n.i; // this passes
}
int& foo(nonpod_pack2& p) {
return p.p.n.i; // this barfs
}
This is intended behavior: a non-POD type which has been marked as packed can
be used as a packed field. 13983 and 17519 are bugs in that feature.
In this case, nonpod_pack::n is not packed, so it is safe to pack fields of
nonpod_pack type.
Hmm, actually comment #2 does seem like a bug, both foos should compile
cleanly.
Or perhaps we should ignore the __attribute__ ((packed)) on nonpod_pack, since
one of its fields isn't safe to pack. Yes, that seems like the right way to
handle this testcase.
reported against 4.1; bootstrapped 4.1.2 CVS with this patch with no
regressions. ok to apply to the 4.1 branch?
Matthias
Subject: Bug 26670
Author: jason
Date: Wed Aug 30 15:52:12 2006
New Revision: 116592
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116592
Log:
PR c++/26670
* class.c (check_field_decls): Don't unset TYPE_PACKED until all
the fields have been processed.
PR c++/26670
* class.c (check_field_decls): Unset TYPE_PACKED (t) if one of the
fields can't be packed.
Modified:
branches/gcc-4_1-branch/gcc/cp/ChangeLog
branches/gcc-4_1-branch/gcc/cp/class.c