diff options
author | Eric Fiselier <eric@efcs.ca> | 2018-10-25 18:16:16 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2018-10-25 18:16:16 +0000 |
commit | 84eaf0c9e42ad8480a52cfc3d3cd28d432495fec (patch) | |
tree | 45d366570bd5ae9ebc604d1a00a734c7833eadb5 /clang/lib/Sema/SemaExprCXX.cpp | |
parent | 384a74b0e63d847650e10ac7886fdadd44fc431c (diff) | |
download | bcm5719-llvm-84eaf0c9e42ad8480a52cfc3d3cd28d432495fec.tar.gz bcm5719-llvm-84eaf0c9e42ad8480a52cfc3d3cd28d432495fec.zip |
[SemaCXX] Unconfuse Clang when std::align_val_t is unscoped in C++03
Summary:
When -faligned-allocation is specified in C++03 libc++ defines std::align_val_t as an unscoped enumeration type (because Clang didn't provide scoped enumerations as an extension until 8.0).
Unfortunately Clang confuses the `align_val_t` overloads of delete with the sized deallocation overloads which aren't enabled. This caused Clang to call the aligned deallocation function as if it were the sized deallocation overload.
For example: https://godbolt.org/z/xXJELh
This patch fixes the confusion.
Reviewers: rsmith, EricWF
Reviewed By: EricWF
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D53508
llvm-svn: 345296
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 1349b5af6aa..43e753636d1 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1515,8 +1515,11 @@ namespace { if (FD->getNumParams() == NumBaseParams + 2) HasAlignValT = HasSizeT = true; else if (FD->getNumParams() == NumBaseParams + 1) { - HasSizeT = FD->getParamDecl(NumBaseParams)->getType()->isIntegerType(); - HasAlignValT = !HasSizeT; + QualType ParamTy = FD->getParamDecl(NumBaseParams)->getType(); + HasAlignValT = ParamTy->isAlignValT(); + HasSizeT = !HasAlignValT; + assert((HasAlignValT || ParamTy->isIntegerType()) && + "Candidate is not regular dealloc function"); } // In CUDA, determine how much we'd like / dislike to call this. |