diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3251,6 +3251,10 @@ : Warning<"requested alignment must be %0 bytes or smaller; maximum " "alignment assumed">, InGroup>; +def warn_not_xl_compatible + : Warning<"requested alignment of arguments 16 bytes or greater is not" + " compatible with previous versions of the AIX XL compiler">, + InGroup>; def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning< "%q0 redeclared without %1 attribute: previous %1 ignored">, InGroup; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3954,6 +3954,9 @@ uint64_t AlignVal = Alignment.getZExtValue(); + if (Context.getTargetInfo().getTriple().isOSAIX() && (AlignVal >= 16)) + Diag(AttrLoc, diag::warn_not_xl_compatible) << E->getSourceRange(); + // C++11 [dcl.align]p2: // -- if the constant expression evaluates to zero, the alignment // specifier shall have no effect diff --git a/clang/test/Sema/aix-attr-align.c b/clang/test/Sema/aix-attr-align.c new file mode 100644 --- /dev/null +++ b/clang/test/Sema/aix-attr-align.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -verify -fsyntax-only %s +// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -verify -fsyntax-only %s + +struct S { + int a[8] __attribute__((aligned(8))); // no-warning +}; + +struct T { + int a[4] __attribute__((aligned(16))); // expected-warning {{requested alignment of arguments 16 bytes or greater is not compatible with previous versions of the AIX XL compiler}} +}; + +struct U { + int a[2] __attribute__((aligned(32))); // expected-warning {{requested alignment of arguments 16 bytes or greater is not compatible with previous versions of the AIX XL compiler}} +};