diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -838,13 +838,14 @@ - GCC doesn't pack non-POD members in packed structs unless the packed attribute is also specified on the member. Clang historically did perform - such packing. Clang now matches the gcc behavior (except on Darwin and PS4). + such packing. Clang now matches the gcc behavior + (except on Darwin, PS4 and AIX). You can switch back to the old ABI behavior with the flag: ``-fclang-abi-compat=15.0``. - GCC allows POD types to have defaulted special members. Clang historically classified such types as non-POD (for the purposes of Itanium ABI). Clang now - matches the gcc behavior (except on Darwin and PS4). You can switch back to - the old ABI behavior with the flag: ``-fclang-abi-compat=15.0``. + matches the gcc behavior (except on Darwin, PS4, AIX and z/OS). You can switch + back to the old ABI behavior with the flag: ``-fclang-abi-compat=15.0``. OpenMP Support in Clang ----------------------- diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -1968,7 +1968,8 @@ FieldClass->hasAttr() || Context.getLangOpts().getClangABICompat() <= LangOptions::ClangABI::Ver15 || - Target.isPS() || Target.isOSDarwin())) || + Target.isPS() || Target.isOSDarwin() || + Target.isOSAIX())) || D->hasAttr(); // When used as part of a typedef, or together with a 'packed' attribute, the diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h @@ -773,6 +773,10 @@ } bool defaultsToAIXPowerAlignment() const override { return true; } + + bool areDefaultedSMFStillPOD(const LangOptions &) const override { + return false; + } }; // z/OS target @@ -831,6 +835,10 @@ this->UseLeadingZeroLengthBitfield = false; this->ZeroLengthBitfieldBoundary = 32; } + + bool areDefaultedSMFStillPOD(const LangOptions &) const override { + return false; + } }; void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, diff --git a/clang/test/SemaCXX/class-layout.cpp b/clang/test/SemaCXX/class-layout.cpp --- a/clang/test/SemaCXX/class-layout.cpp +++ b/clang/test/SemaCXX/class-layout.cpp @@ -7,8 +7,17 @@ // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=14 -DCLANG_ABI_COMPAT=14 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=16 -DCLANG_ABI_COMPAT=16 +// RUN: %clang_cc1 -triple powerpc-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -DCLANG_ABI_COMPAT=15 +// RUN: %clang_cc1 -triple powerpc-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 +// RUN: %clang_cc1 -triple powerpc64-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -DCLANG_ABI_COMPAT=15 +// RUN: %clang_cc1 -triple powerpc64-ibm-aix7.3.0.0 %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 +// RUN: %clang_cc1 -triple s390x-none-zos %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base +// RUN: %clang_cc1 -triple s390x-none-zos %s -fsyntax-only -verify -std=c++11 -Wno-inaccessible-base -fclang-abi-compat=15 -DCLANG_ABI_COMPAT=15 + // expected-no-diagnostics +#if !defined(__MVS__) && !defined(_AIX) + #define SA(n, p) int a##n[(p) ? 1 : -1] struct A { @@ -611,6 +620,8 @@ #pragma pack(pop) } +#endif // !defined(__MVS__) && !defined(__AIX__) + namespace non_pod { struct t1 { protected: @@ -670,11 +681,15 @@ struct t2 { t1 v1; } __attribute__((packed)); +#if (defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 15) || !defined(__MVS__) _Static_assert(_Alignof(t2) == 1, ""); +#else +_Static_assert(_Alignof(t2) == 4, ""); +#endif struct t3 : t1 { char c; }; -#if defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 15 +#if (defined(CLANG_ABI_COMPAT) && CLANG_ABI_COMPAT <= 15) || defined(__MVS__) _Static_assert(sizeof(t3) == 8, ""); #else _Static_assert(sizeof(t3) == 12, "");