This is an archive of the discontinued LLVM Phabricator instance.

Anonymous unions should be transparent wrt `[[clang::trivial_abi]]`.
AbandonedPublic

Authored by lukasza on Jul 21 2023, 3:36 PM.

Details

Reviewers
gribozavr2
Summary

Consider the test input below:

struct [[clang::trivial_abi]] Trivial {
  Trivial() {}
  Trivial(Trivial&& other) {}
  Trivial& operator=(Trivial&& other) { return *this; }
  ~Trivial() {}
};
static_assert(__is_trivially_relocatable(Trivial), "");

struct [[clang::trivial_abi]] S {
  S(S&& other) {}
  S& operator=(S&& other) { return *this; }
  ~S() {}
  union { Trivial field; };
};
static_assert(__is_trivially_relocatable(S), "");

Before the fix Clang would warn that 'trivial_abi' is disallowed on 'S'
because it has a field of a non-trivial class type (the type of the
anonymous union is non-trivial, because it doesn't have the
[[clang::trivial_abi]] attribute applied to it). Consequently, before
the fix the static_assert about __is_trivially_relocatable would
fail.

Note that [[clang::trivial_abi]] cannot be applied to the anonymous
union, because Clang warns that 'trivial_abi' is disallowed on '(unnamed
union at ...)' because its copy constructors and move constructors are
all deleted. Also note that it is impossible to provide copy nor move
constructors for anonymous unions and structs.

Diff Detail

Event Timeline

lukasza created this revision.Jul 21 2023, 3:36 PM
Herald added a project: Restricted Project. · View Herald TranscriptJul 21 2023, 3:36 PM
lukasza requested review of this revision.Jul 21 2023, 3:36 PM
Herald added a project: Restricted Project. · View Herald TranscriptJul 21 2023, 3:36 PM
Herald added a subscriber: cfe-commits. · View Herald Transcript