From patchwork Wed Oct 24 19:48:20 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [C++] PR 53761 Date: Wed, 24 Oct 2012 09:48:20 -0000 From: Paolo Carlini X-Patchwork-Id: 193940 Message-Id: <50884604.2030308@oracle.com> To: Jason Merrill Cc: "gcc-patches@gcc.gnu.org" Hi, On 10/24/2012 06:57 PM, Jason Merrill wrote: > On 10/10/2012 11:13 AM, Paolo Carlini wrote: >> - error ("type transparent class %qT does not have any fields", t); >> + if (TREE_CODE (t) == UNION_TYPE) >> + error ("type transparent union %qT does not have any >> fields", t); >> + else >> + error ("type transparent class %qT does not have any >> fields", t); > If you use %q#T you don't need to repeat the class-key. Indeed. > >> + error ("type transparent union %qT cannot be made >> transparent", t); > > Let's say why not. Thus I tested the below. Thanks, Paolo. ////////////////////// Index: cp/class.c =================================================================== --- cp/class.c (revision 192762) +++ cp/class.c (working copy) @@ -6261,7 +6261,7 @@ finish_struct_1 (tree t) tree field = first_field (t); if (field == NULL_TREE || error_operand_p (field)) { - error ("type transparent class %qT does not have any fields", t); + error ("type transparent %q#T does not have any fields", t); TYPE_TRANSPARENT_AGGR (t) = 0; } else if (DECL_ARTIFICIAL (field)) @@ -6275,6 +6275,12 @@ finish_struct_1 (tree t) } TYPE_TRANSPARENT_AGGR (t) = 0; } + else if (TYPE_MODE (t) != DECL_MODE (field)) + { + error ("type transparent %q#T cannot be made transparent because " + "a field has neither pointer nor integer type", t); + TYPE_TRANSPARENT_AGGR (t) = 0; + } } } Index: testsuite/g++.dg/ext/transparent-union.C =================================================================== --- testsuite/g++.dg/ext/transparent-union.C (revision 0) +++ testsuite/g++.dg/ext/transparent-union.C (working copy) @@ -0,0 +1,5 @@ +// PR c++/53761 + +typedef union { // { dg-error "type transparent" } + double x; +} __attribute__(( __transparent_union__ )) example_t;