summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKelvin Li <kkwli0@gmail.com>2016-07-20 19:41:17 +0000
committerKelvin Li <kkwli0@gmail.com>2016-07-20 19:41:17 +0000
commit4f161cf1c2cad898740f2ba23ba64042ec590b5d (patch)
treec3decc4a9728041799ebe56afc4d788d32708dab
parent628fd34e840f39a4202654de8851e1dc6596580a (diff)
downloadbcm5719-llvm-4f161cf1c2cad898740f2ba23ba64042ec590b5d.tar.gz
bcm5719-llvm-4f161cf1c2cad898740f2ba23ba64042ec590b5d.zip
[OpenMP] Ignore parens in atomic capture
Clang misdiagnoses atomic captures cases that contains parens. i.e. int v, int *p; #pragma omp atomic capture { v = (*p); (*p)++; } Patch by David S. Differential Revision: https://reviews.llvm.org/D22487 llvm-svn: 276167
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp4
-rw-r--r--clang/test/OpenMP/atomic_messages.c4
-rw-r--r--clang/test/OpenMP/atomic_messages.cpp4
3 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 3f9c35c508b..d55d6ecc79a 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -6163,7 +6163,7 @@ bool OpenMPAtomicUpdateChecker::checkStatement(Stmt *S, unsigned DiagId,
AtomicCompAssignOp->getOpcode());
OpLoc = AtomicCompAssignOp->getOperatorLoc();
E = AtomicCompAssignOp->getRHS();
- X = AtomicCompAssignOp->getLHS();
+ X = AtomicCompAssignOp->getLHS()->IgnoreParens();
IsXLHSInRHSPart = true;
} else if (auto *AtomicBinOp = dyn_cast<BinaryOperator>(
AtomicBody->IgnoreParenImpCasts())) {
@@ -6177,7 +6177,7 @@ bool OpenMPAtomicUpdateChecker::checkStatement(Stmt *S, unsigned DiagId,
IsPostfixUpdate = AtomicUnaryOp->isPostfix();
Op = AtomicUnaryOp->isIncrementOp() ? BO_Add : BO_Sub;
OpLoc = AtomicUnaryOp->getOperatorLoc();
- X = AtomicUnaryOp->getSubExpr();
+ X = AtomicUnaryOp->getSubExpr()->IgnoreParens();
E = SemaRef.ActOnIntegerConstant(OpLoc, /*uint64_t Val=*/1).get();
IsXLHSInRHSPart = true;
} else {
diff --git a/clang/test/OpenMP/atomic_messages.c b/clang/test/OpenMP/atomic_messages.c
index 8182465494b..7b3178bba49 100644
--- a/clang/test/OpenMP/atomic_messages.c
+++ b/clang/test/OpenMP/atomic_messages.c
@@ -313,6 +313,8 @@ int captureint() {
#pragma omp atomic capture
{c = a; a++;}
#pragma omp atomic capture
+ {c = a; (a)++;}
+#pragma omp atomic capture
{++a;c = a;}
#pragma omp atomic capture
{c = a;a--;}
@@ -321,6 +323,8 @@ int captureint() {
#pragma omp atomic capture
{c = a; a += b;}
#pragma omp atomic capture
+ {c = a; (a) += b;}
+#pragma omp atomic capture
{a %= b; c = a;}
#pragma omp atomic capture
{c = a; a *= b;}
diff --git a/clang/test/OpenMP/atomic_messages.cpp b/clang/test/OpenMP/atomic_messages.cpp
index 7f78ad443da..efb368d1a7c 100644
--- a/clang/test/OpenMP/atomic_messages.cpp
+++ b/clang/test/OpenMP/atomic_messages.cpp
@@ -453,6 +453,8 @@ T capture() {
#pragma omp atomic capture
{c = a; a++;}
#pragma omp atomic capture
+ {c = a; (a)++;}
+#pragma omp atomic capture
{++a;c = a;}
#pragma omp atomic capture
{c = a;a--;}
@@ -461,6 +463,8 @@ T capture() {
#pragma omp atomic capture
{c = a; a += b;}
#pragma omp atomic capture
+ {c = a; (a) += b;}
+#pragma omp atomic capture
{a %= b; c = a;}
#pragma omp atomic capture
{c = a; a *= b;}
OpenPOWER on IntegriCloud