[Bug c++/95976] New: [[no_unique_address]] on union members has the opposite-of-intended effect

metaprogrammingtheworld at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Jun 29 16:52:36 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95976

            Bug ID: 95976
           Summary: [[no_unique_address]] on union members has the
                    opposite-of-intended effect
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: metaprogrammingtheworld at gmail dot com
  Target Milestone: ---

When using [[no_unique_address]] with union members, ironically, each member is
now given a unique address! Without [[no_unique_address]], the layout is as one
would expect. This is particularly unfortunate since it means that a union's
size grows in proportion to the number of members when using
[[no_unique_address]]!

Example:

//////////
struct empty {};

union no_attribute_t
{
  empty _0;
  empty _1;
};

union with_attribute_t
{
  [[no_unique_address]] empty _0;
  [[no_unique_address]] empty _1;
};

constexpr no_attribute_t no_attribute{};
constexpr with_attribute_t with_attribute{};

// This succeeds
static_assert( &no_attribute._0 == &no_attribute._1 );

// This fails
static_assert( &with_attribute._0 == &with_attribute._1 );
//////////


More information about the Gcc-bugs mailing list