summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaitlin Sadowski <supertri@google.com>2011-09-15 17:50:19 +0000
committerCaitlin Sadowski <supertri@google.com>2011-09-15 17:50:19 +0000
commitbf06c72aa9e17ea119437b668a3185606d381a38 (patch)
treeb9edf0fe97ebdbc696376d630873dd5216f6b07a
parent6525fb25cbd7dd45061b6b7350e535c8b42db427 (diff)
downloadbcm5719-llvm-bf06c72aa9e17ea119437b668a3185606d381a38.tar.gz
bcm5719-llvm-bf06c72aa9e17ea119437b668a3185606d381a38.zip
Thread safety: cleaning up FIXME for trylocks
llvm-svn: 139805
-rw-r--r--clang/include/clang/Basic/Attr.td8
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp8
2 files changed, 10 insertions, 6 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index f61ae7f15db..4d9aa5b9a3b 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -602,15 +602,19 @@ def SharedLockFunction : InheritableAttr {
let LateParsed = 1;
}
+// The first argument is an integer or boolean value specifying the return value
+// of a successful lock acquisition.
def ExclusiveTrylockFunction : InheritableAttr {
let Spellings = ["exclusive_trylock_function"];
- let Args = [VariadicExprArgument<"Args">];
+ let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
let LateParsed = 1;
}
+// The first argument is an integer or boolean value specifying the return value
+// of a successful lock acquisition.
def SharedTrylockFunction : InheritableAttr {
let Spellings = ["shared_trylock_function"];
- let Args = [VariadicExprArgument<"Args">];
+ let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
let LateParsed = 1;
}
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index a887ce8ac35..3deab0d6714 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -540,23 +540,23 @@ static void handleTrylockFunAttr(Sema &S, Decl *D, const AttributeList &Attr,
}
SmallVector<Expr*, 2> Args;
- Args.push_back(Attr.getArg(0)); //FIXME
// check that all arguments are lockable objects
if (!checkAttrArgsAreLockableObjs(S, D, Attr, Args, 1))
return;
unsigned Size = Args.size();
- assert(Size == Attr.getNumArgs());
Expr **StartArg = Size == 0 ? 0 : &Args[0];
if (exclusive)
D->addAttr(::new (S.Context) ExclusiveTrylockFunctionAttr(Attr.getRange(),
S.Context,
+ Attr.getArg(0),
StartArg, Size));
else
D->addAttr(::new (S.Context) SharedTrylockFunctionAttr(Attr.getRange(),
- S.Context, StartArg,
- Size));
+ S.Context,
+ Attr.getArg(0),
+ StartArg, Size));
}
static void handleLocksRequiredAttr(Sema &S, Decl *D, const AttributeList &Attr,
OpenPOWER on IntegriCloud