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

            Bug ID: 112591
           Summary: variant allows for creating multiple empty objects at
                    same address
           Product: gcc
           Version: 13.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: barry.revzin at gmail dot com
  Target Milestone: ---

Consider:

#include <variant>
#include <iostream>

struct Empty { ~Empty() {} };
struct Sub : Empty { std::variant<Empty> e; };

int main() {
    Sub v;

    Empty* base = &v;
    Empty* obj = &std::get<Empty>(v.e);

    std::cout
        << "base=" << (void*)base
        << " obj=" << (void*)obj
        << " matches=" << (base == obj)
        << '\n';
}

In C++17 mode on trunk, base and obj have the same address.
In C++20 mode up through 11.4, they have the same address. Since 12.1, they do
not.

If Empty were trivially destructible, they never have the same address.

Reply via email to