foo: asm goto ("# %0 %1"::"i"(&&foo)::foo);
-- ``__builtin_object_size`` and ``__builtin_dynamic_object_size`` now add the
- ``sizeof`` the elements specified in designated initializers of flexible
- array members for structs that contain them. This change is more consistent
- with the behavior of GCC.
-
C++ Specific Potentially Breaking Changes
-----------------------------------------
- Clang won't search for coroutine_traits in std::experimental namespace any more.
(`#61746 <https://github.com/llvm/llvm-project/issues/61746>`_).
- Clang `TextNodeDumper` enabled through `-ast-dump` flag no longer evaluates the
initializer of constexpr `VarDecl` if the declaration has a dependent type.
-- Match GCC's behavior for ``__builtin_object_size`` and
- ``__builtin_dynamic_object_size`` on structs containing flexible array
- members.
- (`#62789 <https://github.com/llvm/llvm-project/issues/62789>`_).
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
auto CheckedHandleSizeof = [&](QualType Ty, CharUnits &Result) {
if (Ty.isNull() || Ty->isIncompleteType() || Ty->isFunctionType())
return false;
- bool Ret = HandleSizeof(Info, ExprLoc, Ty, Result);
- if (Ty->isStructureType() &&
- Ty->getAsStructureType()->getDecl()->hasFlexibleArrayMember()) {
- const auto *VD =
- cast<VarDecl>(LVal.getLValueBase().get<const ValueDecl *>());
- Result += VD->getFlexibleArrayInitChars(Info.Ctx);
- }
- return Ret;
+ return HandleSizeof(Info, ExprLoc, Ty, Result);
};
// We want to evaluate the size of the entire object. This is a valid fallback
gi = OBJECT_SIZE_BUILTIN(&dsv[9].snd[0], 1);
}
-// CHECK-LABEL: @test32
-static struct DynStructVar D32 = {
- .fst = {},
- .snd = { 0, 1, 2, },
-};
-unsigned long test32(void) {
- // CHECK: ret i64 19
- return OBJECT_SIZE_BUILTIN(&D32, 1);
-}
-// CHECK-LABEL: @test33
-static struct DynStructVar D33 = {
- .fst = {},
- .snd = {},
-};
-unsigned long test33(void) {
- // CHECK: ret i64 16
- return OBJECT_SIZE_BUILTIN(&D33, 1);
-}
-// CHECK-LABEL: @test34
-static struct DynStructVar D34 = {
- .fst = {},
-};
-unsigned long test34(void) {
- // CHECK: ret i64 16
- return OBJECT_SIZE_BUILTIN(&D34, 1);
-}
-
// CHECK-LABEL: @PR30346
void PR30346(void) {
struct sa_family_t {};