- 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
-----------------------
FieldClass->hasAttr<PackedAttr>() ||
Context.getLangOpts().getClangABICompat() <=
LangOptions::ClangABI::Ver15 ||
- Target.isPS() || Target.isOSDarwin())) ||
+ Target.isPS() || Target.isOSDarwin() ||
+ Target.isOSAIX())) ||
D->hasAttr<PackedAttr>();
// When used as part of a typedef, or together with a 'packed' attribute, the
}
bool defaultsToAIXPowerAlignment() const override { return true; }
+
+ bool areDefaultedSMFStillPOD(const LangOptions &) const override {
+ return false;
+ }
};
// z/OS target
this->UseLeadingZeroLengthBitfield = false;
this->ZeroLengthBitfieldBoundary = 32;
}
+
+ bool areDefaultedSMFStillPOD(const LangOptions &) const override {
+ return false;
+ }
};
void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts,
// 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 {
#pragma pack(pop)
}
+#endif // !defined(__MVS__) && !defined(__AIX__)
+
namespace non_pod {
struct t1 {
protected:
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, "");