aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2011-10-14 22:48:56 +0000
committerEli Friedman <eli.friedman@gmail.com>2011-10-14 22:48:56 +0000
commitdfa64ba45922e1c28e36341bdf34785fea74659b (patch)
tree088ada460de7feb4c2e3b3baf13b869444efbb5e /lib/Sema/SemaChecking.cpp
parent7c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1 (diff)
Add template instantiation support for AtomicExpr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142012 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
-rw-r--r--lib/Sema/SemaChecking.cpp37
1 files changed, 15 insertions, 22 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index 74c69a3ce3..310138354b 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -475,7 +475,6 @@ ExprResult
Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult, AtomicExpr::AtomicOp Op) {
CallExpr *TheCall = cast<CallExpr>(TheCallResult.get());
DeclRefExpr *DRE =cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts());
- Expr *Ptr, *Order, *Val1, *Val2, *OrderFail;
// All these operations take one of the following four forms:
// T __atomic_load(_Atomic(T)*, int) (loads)
@@ -508,7 +507,7 @@ Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult, AtomicExpr::AtomicOp Op)
// Inspect the first argument of the atomic operation. This should always be
// a pointer to an _Atomic type.
- Ptr = TheCall->getArg(0);
+ Expr *Ptr = TheCall->getArg(0);
Ptr = DefaultFunctionArrayLvalueConversion(Ptr).get();
const PointerType *pointerType = Ptr->getType()->getAs<PointerType>();
if (!pointerType) {
@@ -591,30 +590,24 @@ Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult, AtomicExpr::AtomicOp Op)
TheCall->setArg(i, Arg.get());
}
+ SmallVector<Expr*, 5> SubExprs;
+ SubExprs.push_back(Ptr);
if (Op == AtomicExpr::Load) {
- Order = TheCall->getArg(1);
- return Owned(new (Context) AtomicExpr(TheCall->getCallee()->getLocStart(),
- Ptr, Order, ResultType, Op,
- TheCall->getRParenLoc(), false,
- false));
+ SubExprs.push_back(TheCall->getArg(1)); // Order
} else if (Op != AtomicExpr::CmpXchgWeak && Op != AtomicExpr::CmpXchgStrong) {
- Val1 = TheCall->getArg(1);
- Order = TheCall->getArg(2);
- return Owned(new (Context) AtomicExpr(TheCall->getCallee()->getLocStart(),
- Ptr, Val1, Order, ResultType, Op,
- TheCall->getRParenLoc(), false,
- false));
+ SubExprs.push_back(TheCall->getArg(2)); // Order
+ SubExprs.push_back(TheCall->getArg(1)); // Val1
} else {
- Val1 = TheCall->getArg(1);
- Val2 = TheCall->getArg(2);
- Order = TheCall->getArg(3);
- OrderFail = TheCall->getArg(4);
- return Owned(new (Context) AtomicExpr(TheCall->getCallee()->getLocStart(),
- Ptr, Val1, Val2, Order, OrderFail,
- ResultType, Op,
- TheCall->getRParenLoc(), false,
- false));
+ SubExprs.push_back(TheCall->getArg(3)); // Order
+ SubExprs.push_back(TheCall->getArg(1)); // Val1
+ SubExprs.push_back(TheCall->getArg(2)); // Val2
+ SubExprs.push_back(TheCall->getArg(4)); // OrderFail
}
+
+ return Owned(new (Context) AtomicExpr(TheCall->getCallee()->getLocStart(),
+ SubExprs.data(), SubExprs.size(),
+ ResultType, Op,
+ TheCall->getRParenLoc()));
}