diff options
author | Eric Fiselier <eric@efcs.ca> | 2018-10-24 22:38:49 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2018-10-24 22:38:49 +0000 |
commit | 5e707cb274911a76e129c1faa71dd95d2b580101 (patch) | |
tree | 404a20e7ef2b7a135994b03c4e261edc35f47ccc /clang/lib | |
parent | 43bc46207a909c84651ac77f72fbc478d525594c (diff) | |
download | bcm5719-llvm-5e707cb274911a76e129c1faa71dd95d2b580101.tar.gz bcm5719-llvm-5e707cb274911a76e129c1faa71dd95d2b580101.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: 345211
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 1349b5af6aa..03ec20601c9 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1515,8 +1515,9 @@ 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 && ParamTy->isIntegerType(); } // In CUDA, determine how much we'd like / dislike to call this. |