From f303a996311673f8c9178f6593bf4c804077a8ec Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 8 Aug 2005 14:22:35 +0000 Subject: [PATCH] re PR c++/21166 (g++ gives error on reference to packed structure elements) .: PR c++/21166 * stor-layout.c (finalize_type_size): Undo DECL_PACKED when possible. testsuite: PR c++/21166 * g++.dg/other/crash-4.C: Adjust * g++/dg/ext/packed9.C: New. From-SVN: r102858 --- gcc/ChangeLog | 5 +++++ gcc/stor-layout.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/ext/packed9.C | 20 ++++++++++++++++++++ gcc/testsuite/g++.dg/other/crash-4.C | 2 ++ 5 files changed, 44 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/packed9.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f6b156f127b..0996eced0df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-08-08 Nathan Sidwell + + PR c++/21166 + * stor-layout.c (finalize_type_size): Undo DECL_PACKED when possible. + 2005-08-07 James A. Morrison * tree-vrp.c (simplify_div_or_mod_using_range): Use build2. diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 77dfc192775..321a4d24ca4 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -1477,6 +1477,8 @@ finalize_type_size (tree type) void finish_record_layout (record_layout_info rli, int free_p) { + tree field; + /* Compute the final size. */ finalize_record_size (rli); @@ -1486,6 +1488,15 @@ finish_record_layout (record_layout_info rli, int free_p) /* Perform any last tweaks to the TYPE_SIZE, etc. */ finalize_type_size (rli->t); + /* We might be able to clear DECL_PACKED on any members that happen + to be suitably aligned (not forgetting the alignment of the type + itself). */ + for (field = TYPE_FIELDS (rli->t); field; field = TREE_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field) + && DECL_OFFSET_ALIGN (field) >= TYPE_ALIGN (TREE_TYPE (field)) + && TYPE_ALIGN (rli->t) >= TYPE_ALIGN (TREE_TYPE (field))) + DECL_PACKED (field) = 0; + /* Lay out any static members. This is done now because their type may use the record's type. */ while (rli->pending_statics) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7b171dac0bb..77cf6334b68 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-08-08 Nathan Sidwell + + PR c++/21166 + * g++.dg/other/crash-4.C: Adjust + * g++/dg/ext/packed9.C: New. + 2005-08-08 Richard Sandiford PR middle-end/21964 diff --git a/gcc/testsuite/g++.dg/ext/packed9.C b/gcc/testsuite/g++.dg/ext/packed9.C new file mode 100644 index 00000000000..ba5d4ab044f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed9.C @@ -0,0 +1,20 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Apr 2005 + +// DR21166. unnecessary error on packed char + +struct s1 { + char c1; +} __attribute__((packed)); + +char& +f(struct s1 *s) +{ + return s->c1; +} + +char * +g(struct s1 *s) +{ + return &s->c1; +} diff --git a/gcc/testsuite/g++.dg/other/crash-4.C b/gcc/testsuite/g++.dg/other/crash-4.C index 35f23e8ccc0..986c498e654 100644 --- a/gcc/testsuite/g++.dg/other/crash-4.C +++ b/gcc/testsuite/g++.dg/other/crash-4.C @@ -6,10 +6,12 @@ struct a { + int m; a(const a&); }; struct b { // { dg-error "cannot bind packed field" } + char c; a aa __attribute__((packed)); }; struct c -- 2.30.2