[PATCH] D89649: Fix __has_unique_object_representations with no_unique_address
    Richard Smith - zygoloid via Phabricator via cfe-commits 
    cfe-commits at lists.llvm.org
       
    Sun Oct 18 13:47:59 PDT 2020
    
    
  
rsmith accepted this revision.
rsmith added a comment.
This revision is now accepted and ready to land.
This looks fine as far as it goes, but it doesn't fix all cases of incorrect behavior of `__has_unique_object_representations` due to `[[no_unique_address]]`. Feel free to either to land this as-is and leave the other case to a separate patch, or fix it as a revision of this same change. I would expect we'll want to unify the code paths for base classes and non-static data members, which might be better done all at once.
================
Comment at: clang/lib/AST/ASTContext.cpp:2580-2581
       if (!isStructEmpty(Base.getType())) {
         llvm::Optional<int64_t> Size = structHasUniqueObjectRepresentations(
             Context, Base.getType()->castAs<RecordType>()->getDecl());
         if (!Size)
----------------
We need to do this for non-empty `[[no_unique_address]]` members of class type too, to handle tail padding reuse in cases such as:
```
struct A {
    ~A();
    int a;
    char b;
};
struct B {
    [[no_unique_address]] A a;
    char c[3];
};
static_assert(sizeof(B) == 8, "");
static_assert(__has_unique_object_representations(B), "");
```
Repository:
  rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D89649/new/
https://reviews.llvm.org/D89649
    
    
More information about the cfe-commits
mailing list