Author: Aaron Ballman Date: 2024-07-02T10:34:34-04:00 New Revision: a0ab0ca7a733eb9e8e6442676a974ff8a2cdb930
URL: https://github.com/llvm/llvm-project/commit/a0ab0ca7a733eb9e8e6442676a974ff8a2cdb930 DIFF: https://github.com/llvm/llvm-project/commit/a0ab0ca7a733eb9e8e6442676a974ff8a2cdb930.diff LOG: [C2y] Add diagnostics for alignof on an incomplete array Clang implemented WG14 N3273 since Clang 3.5 Added: clang/test/C/C2y/n3273.c Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaExpr.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 3d3e98c7b751b..3df64b2ecef1b 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3547,6 +3547,12 @@ def warn_alignment_not_power_of_two : Warning< InGroup<DiagGroup<"non-power-of-two-alignment">>; def err_alignment_dependent_typedef_name : Error< "requested alignment is dependent but declaration is not dependent">; +def ext_c2y_alignof_incomplete_array : Extension< + "'alignof' on an incomplete array type is a C2y extension">, + InGroup<C2y>; +def warn_c2y_compat_alignof_incomplete_array : Warning< + "'alignof' on an incomplete array type is incompatible with C standards " + "before C2y">, InGroup<CPre2yCompat>, DefaultIgnore; def warn_alignment_builtin_useless : Warning< "%select{aligning a value|the result of checking whether a value is aligned}0" diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 1437fa08d2e7a..852344d895ffd 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4486,8 +4486,16 @@ bool Sema::CheckUnaryExprOrTypeTraitOperand(QualType ExprType, // When alignof or _Alignof is applied to an array type, the result // is the alignment of the element type. if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf || - ExprKind == UETT_OpenMPRequiredSimdAlign) + ExprKind == UETT_OpenMPRequiredSimdAlign) { + // If the trait is 'alignof' in C before C2y, the ability to apply the + // trait to an incomplete array is an extension. + if (ExprKind == UETT_AlignOf && !getLangOpts().CPlusPlus && + ExprType->isIncompleteArrayType()) + Diag(OpLoc, getLangOpts().C2y + ? diag::warn_c2y_compat_alignof_incomplete_array + : diag::ext_c2y_alignof_incomplete_array); ExprType = Context.getBaseElementType(ExprType); + } if (ExprKind == UETT_VecStep) return CheckVecStepTraitOperandType(*this, ExprType, OpLoc, ExprRange); diff --git a/clang/test/C/C2y/n3273.c b/clang/test/C/C2y/n3273.c new file mode 100644 index 0000000000000..84eeadd89ee62 --- /dev/null +++ b/clang/test/C/C2y/n3273.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -verify -std=c2y -Wall -pedantic -Wpre-c2y-compat %s +// RUN: %clang_cc1 -verify=pre-c2y -std=c23 -Wall -pedantic %s + +/* WG14 N3273: Clang 3.5 + * alignof of an incomplete array type + */ + +static_assert( + alignof(int[]) == /* pre-c2y-warning {{'alignof' on an incomplete array type is a C2y extension}} + expected-warning {{'alignof' on an incomplete array type is incompatible with C standards before C2y}} + */ + alignof(int) +); + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits