summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2018-10-24 22:38:49 +0000
committerEric Fiselier <eric@efcs.ca>2018-10-24 22:38:49 +0000
commit5e707cb274911a76e129c1faa71dd95d2b580101 (patch)
tree404a20e7ef2b7a135994b03c4e261edc35f47ccc /clang/lib
parent43bc46207a909c84651ac77f72fbc478d525594c (diff)
downloadbcm5719-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.cpp5
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.
OpenPOWER on IntegriCloud