Revert "P0035R4: Semantic analysis and code generation for C++17 overaligned allocation."
This reverts commit r283722. Breaks:
Clang.SemaCUDA.device-var-init.cu
Clang.CodeGenCUDA.device-var-init.cu
http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-expensive/884/
llvm-svn: 283750
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index e330e31..fec7df0 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -2596,7 +2596,7 @@
return false;
const auto *FPT = getType()->castAs<FunctionProtoType>();
- if (FPT->getNumParams() == 0 || FPT->getNumParams() > 3 || FPT->isVariadic())
+ if (FPT->getNumParams() == 0 || FPT->getNumParams() > 2 || FPT->isVariadic())
return false;
// If this is a single-parameter function, it must be a replaceable global
@@ -2604,42 +2604,20 @@
if (FPT->getNumParams() == 1)
return true;
- unsigned Params = 1;
- QualType Ty = FPT->getParamType(Params);
+ // Otherwise, we're looking for a second parameter whose type is
+ // 'const std::nothrow_t &', or, in C++1y, 'std::size_t'.
+ QualType Ty = FPT->getParamType(1);
ASTContext &Ctx = getASTContext();
-
- auto Consume = [&] {
- ++Params;
- Ty = Params < FPT->getNumParams() ? FPT->getParamType(Params) : QualType();
- };
-
- // In C++14, the next parameter can be a 'std::size_t' for sized delete.
- bool IsSizedDelete = false;
if (Ctx.getLangOpts().SizedDeallocation &&
- (getDeclName().getCXXOverloadedOperator() == OO_Delete ||
- getDeclName().getCXXOverloadedOperator() == OO_Array_Delete) &&
- Ctx.hasSameType(Ty, Ctx.getSizeType())) {
- IsSizedDelete = true;
- Consume();
- }
-
- // In C++17, the next parameter can be a 'std::align_val_t' for aligned
- // new/delete.
- if (Ctx.getLangOpts().AlignedAllocation && !Ty.isNull() && Ty->isAlignValT())
- Consume();
-
- // Finally, if this is not a sized delete, the final parameter can
- // be a 'const std::nothrow_t&'.
- if (!IsSizedDelete && !Ty.isNull() && Ty->isReferenceType()) {
- Ty = Ty->getPointeeType();
- if (Ty.getCVRQualifiers() != Qualifiers::Const)
- return false;
- const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
- if (RD && isNamed(RD, "nothrow_t") && RD->isInStdNamespace())
- Consume();
- }
-
- return Params == FPT->getNumParams();
+ Ctx.hasSameType(Ty, Ctx.getSizeType()))
+ return true;
+ if (!Ty->isReferenceType())
+ return false;
+ Ty = Ty->getPointeeType();
+ if (Ty.getCVRQualifiers() != Qualifiers::Const)
+ return false;
+ const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
+ return RD && isNamed(RD, "nothrow_t") && RD->isInStdNamespace();
}
LanguageLinkage FunctionDecl::getLanguageLinkage() const {