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 @@ -1667,7 +1667,8 @@ return; QualType Ty = getFunctionOrMethodParamType(D, Idx.getASTIndex()); - if (!Ty->isDependentType() && !Ty->isIntegralType(Context)) { + if (!Ty->isDependentType() && !Ty->isIntegralType(Context) && + !Ty->isAlignValT()) { Diag(ParamExpr->getBeginLoc(), diag::err_attribute_integers_only) << &TmpAttr << FuncDecl->getParamDecl(Idx.getASTIndex())->getSourceRange(); diff --git a/clang/test/SemaCXX/std-align-val-t-in-operator-new.cpp b/clang/test/SemaCXX/std-align-val-t-in-operator-new.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/std-align-val-t-in-operator-new.cpp @@ -0,0 +1,59 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++11 -faligned-allocation -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++14 -faligned-allocation -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++17 -faligned-allocation -fsyntax-only -verify %s + +namespace std { +typedef __SIZE_TYPE__ size_t; +struct nothrow_t {}; +#if __cplusplus >= 201103L +enum class align_val_t : size_t {}; +#else +enum align_val_t { +// We can't force an underlying type when targeting windows. +#ifndef _WIN32 + __zero = 0, + __max = (size_t)-1 +#endif +}; +#endif +} // namespace std + +void *operator new(std::size_t count, std::align_val_t al) __attribute__((alloc_align(2))); + +#define OVERALIGNED alignas(__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2) + +struct OVERALIGNED A { + A(); + int n[128]; +}; + +void *ptr_variable(int align) { return new (std::align_val_t(align)) A; } +void *ptr_align16() { return new (std::align_val_t(16)) A; } +void *ptr_align15() { return new (std::align_val_t(15)) A; } + +struct alignas(128) S { + S() {} +}; + +void *alloc_overaligned_struct() { + return new S; +} + +void *alloc_overaligned_struct_with_extra_variable_alignment(int align) { + return new (std::align_val_t(align)) S; +} +void *alloc_overaligned_struct_with_extra_256_alignment(int align) { + return new (std::align_val_t(256)) S; +} +void *alloc_overaligned_struct_with_extra_255_alignment(int align) { + return new (std::align_val_t(255)) S; +} + +std::align_val_t align_variable(int align) { return std::align_val_t(align); } +std::align_val_t align_align16() { return std::align_val_t(16); } +std::align_val_t align_align15() { return std::align_val_t(15); } + +// expected-no-diagnostics