royjacobson updated this revision to Diff 504736. royjacobson added a comment.
Add a test case, slightly simpler modeling. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D145852/new/ https://reviews.llvm.org/D145852 Files: clang/docs/ReleaseNotes.rst clang/lib/AST/ASTContext.cpp clang/test/SemaCXX/type-traits.cpp Index: clang/test/SemaCXX/type-traits.cpp =================================================================== --- clang/test/SemaCXX/type-traits.cpp +++ clang/test/SemaCXX/type-traits.cpp @@ -2878,9 +2878,29 @@ char d : 2; }; +struct UnnamedBitfield { + int named : 8; + int : 24; +}; + +struct UnnamedEmptyBitfield { + int named; + int : 0; +}; + +struct UnnamedEmptyBitfieldSplit { + short named; + int : 0; + short also_named; +}; + static_assert(!has_unique_object_representations<PaddedBitfield>::value, "Bitfield padding"); static_assert(has_unique_object_representations<UnPaddedBitfield>::value, "Bitfield padding"); static_assert(!has_unique_object_representations<AlignedPaddedBitfield>::value, "Bitfield padding"); +static_assert(!has_unique_object_representations<UnnamedBitfield>::value, "Bitfield padding"); +static_assert(has_unique_object_representations<UnnamedEmptyBitfield>::value, "Bitfield padding"); +static_assert(sizeof(UnnamedEmptyBitfieldSplit) != (sizeof(short) * 2), "Wrong size"); +static_assert(!has_unique_object_representations<UnnamedEmptyBitfieldSplit>::value, "Bitfield padding"); struct BoolBitfield { bool b : 8; Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -2810,6 +2810,11 @@ int64_t FieldSizeInBits = Context.toBits(Context.getTypeSizeInChars(Field->getType())); if (Field->isBitField()) { + // If we have explicit padding bits, they don't contribute bits + // to the actual object representation, so return 0. + if (Field->isUnnamedBitfield()) + return 0; + int64_t BitfieldSize = Field->getBitWidthValue(Context); if (IsBitIntType) { if ((unsigned)BitfieldSize > Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -202,6 +202,9 @@ - Fix crash when evaluating consteval constructor of derived class whose base has more than one field. (`#60166 <https://github.com/llvm/llvm-project/issues/60166>`_) +- Fix bug in the computation of the ``__has_unique_object_representations`` + builtin for types with unnamed bitfields. + (`#61336 <https://github.com/llvm/llvm-project/issues/61336>`_) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^
Index: clang/test/SemaCXX/type-traits.cpp =================================================================== --- clang/test/SemaCXX/type-traits.cpp +++ clang/test/SemaCXX/type-traits.cpp @@ -2878,9 +2878,29 @@ char d : 2; }; +struct UnnamedBitfield { + int named : 8; + int : 24; +}; + +struct UnnamedEmptyBitfield { + int named; + int : 0; +}; + +struct UnnamedEmptyBitfieldSplit { + short named; + int : 0; + short also_named; +}; + static_assert(!has_unique_object_representations<PaddedBitfield>::value, "Bitfield padding"); static_assert(has_unique_object_representations<UnPaddedBitfield>::value, "Bitfield padding"); static_assert(!has_unique_object_representations<AlignedPaddedBitfield>::value, "Bitfield padding"); +static_assert(!has_unique_object_representations<UnnamedBitfield>::value, "Bitfield padding"); +static_assert(has_unique_object_representations<UnnamedEmptyBitfield>::value, "Bitfield padding"); +static_assert(sizeof(UnnamedEmptyBitfieldSplit) != (sizeof(short) * 2), "Wrong size"); +static_assert(!has_unique_object_representations<UnnamedEmptyBitfieldSplit>::value, "Bitfield padding"); struct BoolBitfield { bool b : 8; Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -2810,6 +2810,11 @@ int64_t FieldSizeInBits = Context.toBits(Context.getTypeSizeInChars(Field->getType())); if (Field->isBitField()) { + // If we have explicit padding bits, they don't contribute bits + // to the actual object representation, so return 0. + if (Field->isUnnamedBitfield()) + return 0; + int64_t BitfieldSize = Field->getBitWidthValue(Context); if (IsBitIntType) { if ((unsigned)BitfieldSize > Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -202,6 +202,9 @@ - Fix crash when evaluating consteval constructor of derived class whose base has more than one field. (`#60166 <https://github.com/llvm/llvm-project/issues/60166>`_) +- Fix bug in the computation of the ``__has_unique_object_representations`` + builtin for types with unnamed bitfields. + (`#61336 <https://github.com/llvm/llvm-project/issues/61336>`_) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits