This patch cleans up a fixme in the trylock parsing by adding a
separate arg in Attr.td for the first (required) argument.

Cheers,

Caitlin
From 3311a51a1222d536e374c7db1e0e86be946611ca Mon Sep 17 00:00:00 2001
From: Caitlin Sadowski <[email protected]>
Date: Mon, 12 Sep 2011 17:21:31 -0700
Subject: [PATCH] Thread safety: adding support for Trylocks

---
 include/clang/Basic/Attr.td |    8 ++++++--
 lib/Sema/SemaDeclAttr.cpp   |    7 ++++---
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td
index 9289bd2..130beb8 100644
--- a/include/clang/Basic/Attr.td
+++ b/include/clang/Basic/Attr.td
@@ -601,15 +601,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/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
index 2f2e280..8ad36f4 100644
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -540,22 +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.getLoc(),
                                                               S.Context,
+                                                              Attr.getArg(0),
                                                               StartArg, Size));
   else
     D->addAttr(::new (S.Context) SharedTrylockFunctionAttr(Attr.getLoc(),
-                                                           S.Context, StartArg,
+                                                           S.Context,
+                                                           Attr.getArg(0),
+                                                           StartArg,
                                                            Size));
 }
 
-- 
1.7.3.1

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to