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.

------- Comment #1 From Andrew Pinski 2006-03-13 23:15 -------
Hmm, it does not warn about non-PODs which contain non-PODS which had been
warned about already.

------- Comment #2 From Debian GCC Maintainers 2006-03-13 23:53 -------
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
}

------- Comment #3 From Andrew Pinski 2006-03-16 05:35 -------
Hmm, related to PR 13983.

------- Comment #4 From Andrew Pinski 2006-03-16 05:36 -------
And to PR 17519.

------- Comment #5 From Jason Merrill 2006-07-05 20:38 -------
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.

------- Comment #6 From Jason Merrill 2006-07-06 03:48 -------
Hmm, actually comment #2 does seem like a bug, both foos should compile
cleanly.

------- Comment #7 From Jason Merrill 2006-08-28 08:31 -------
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.

------- Comment #8 From Jason Merrill 2006-08-29 06:55 -------
Subject: Bug 26670

Author: jason
Date: Tue Aug 29 06:55:35 2006
New Revision: 116555

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116555
Log:
        PR c++/26670
        * class.c (check_field_decls): Unset TYPE_PACKED (t) if one of the
        fields can't be packed.

Added:
    trunk/gcc/testsuite/g++.dg/ext/packed11.C
Modified:
    trunk/gcc/cp/class.c

------- Comment #9 From Jason Merrill 2006-08-29 07:10 -------
Subject: Bug 26670

Author: jason
Date: Tue Aug 29 07:10:38 2006
New Revision: 116556

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116556
Log:
        PR c++/26670
        * class.c (check_field_decls): Unset TYPE_PACKED (t) if one of the
        fields can't be packed.

Modified:
    trunk/gcc/cp/ChangeLog

------- Comment #10 From Andrew Pinski 2006-08-30 03:54 -------
Fixed.

------- Comment #11 From Debian GCC Maintainers 2006-08-30 05:26 -------
reported against 4.1; bootstrapped 4.1.2 CVS with this patch with no
regressions. ok to apply to the 4.1 branch?

  Matthias

------- Comment #12 From Jason Merrill 2006-08-30 15:51 -------
Subject: Bug 26670

Author: jason
Date: Wed Aug 30 15:51:17 2006
New Revision: 116591

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116591
Log:
        PR c++/26670
        * class.c (check_field_decls): Don't unset TYPE_PACKED until all
        the fields have been processed.

Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/class.c

------- Comment #13 From Jason Merrill 2006-08-30 15:52 -------
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

------- Comment #14 From Jason Merrill 2006-08-30 15:52 -------
fixed on 4.1 branch too.