diff options
| author | Caitlin Sadowski <supertri@google.com> | 2011-09-15 17:50:19 +0000 |
|---|---|---|
| committer | Caitlin Sadowski <supertri@google.com> | 2011-09-15 17:50:19 +0000 |
| commit | bf06c72aa9e17ea119437b668a3185606d381a38 (patch) | |
| tree | b9edf0fe97ebdbc696376d630873dd5216f6b07a | |
| parent | 6525fb25cbd7dd45061b6b7350e535c8b42db427 (diff) | |
| download | bcm5719-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.td | 8 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 8 |
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, |

