summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-02-12 21:07:34 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-02-12 21:07:34 +0000
commitcf7d164ec1c85e9f4d7a1508486342b67828e408 (patch)
treebc38a8f1f6cd99f9e176be82bd51a4df156e71d5 /clang/lib/Sema/SemaExpr.cpp
parentaa150ed780be8448cadfd30ba2a91c857ab86c2d (diff)
downloadbcm5719-llvm-cf7d164ec1c85e9f4d7a1508486342b67828e408.tar.gz
bcm5719-llvm-cf7d164ec1c85e9f4d7a1508486342b67828e408.zip
Sema: Semantically check _Atomic-qualified pointers
This fixes PR22568. llvm-svn: 228959
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 2b4c639dcd8..a9ea72577ab 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -7334,9 +7334,12 @@ static void diagnoseArithmeticOnFunctionPointer(Sema &S, SourceLocation Loc,
/// \returns True if pointer has incomplete type
static bool checkArithmeticIncompletePointerType(Sema &S, SourceLocation Loc,
Expr *Operand) {
- assert(Operand->getType()->isAnyPointerType() &&
- !Operand->getType()->isDependentType());
- QualType PointeeTy = Operand->getType()->getPointeeType();
+ QualType ResType = Operand->getType();
+ if (const AtomicType *ResAtomicType = ResType->getAs<AtomicType>())
+ ResType = ResAtomicType->getValueType();
+
+ assert(ResType->isAnyPointerType() && !ResType->isDependentType());
+ QualType PointeeTy = ResType->getPointeeType();
return S.RequireCompleteType(Loc, PointeeTy,
diag::err_typecheck_arithmetic_incomplete_type,
PointeeTy, Operand->getSourceRange());
@@ -7352,9 +7355,13 @@ static bool checkArithmeticIncompletePointerType(Sema &S, SourceLocation Loc,
/// \returns True when the operand is valid to use (even if as an extension).
static bool checkArithmeticOpPointerOperand(Sema &S, SourceLocation Loc,
Expr *Operand) {
- if (!Operand->getType()->isAnyPointerType()) return true;
+ QualType ResType = Operand->getType();
+ if (const AtomicType *ResAtomicType = ResType->getAs<AtomicType>())
+ ResType = ResAtomicType->getValueType();
+
+ if (!ResType->isAnyPointerType()) return true;
- QualType PointeeTy = Operand->getType()->getPointeeType();
+ QualType PointeeTy = ResType->getPointeeType();
if (PointeeTy->isVoidType()) {
diagnoseArithmeticOnVoidPointer(S, Loc, Operand);
return !S.getLangOpts().CPlusPlus;
OpenPOWER on IntegriCloud