]> granicus.if.org Git - clang/commitdiff
Support for thread safety attributes on functions
authorDeLesley Hutchins <delesley@google.com>
Thu, 29 Dec 2011 00:56:48 +0000 (00:56 +0000)
committerDeLesley Hutchins <delesley@google.com>
Thu, 29 Dec 2011 00:56:48 +0000 (00:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147331 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ThreadSafety.cpp
test/SemaCXX/warn-thread-safety-analysis.cpp

index 005d45545f1c058c776e4af9b5360f4e08d2cad4..a1a8f5a606af80be02d25bf205022c82179911df 100644 (file)
@@ -147,6 +147,9 @@ class MutexID {
       Parent = CE->getImplicitObjectArgument();
       NumArgs = CE->getNumArgs();
       FunArgs = CE->getArgs();
+    } else if (CallExpr *CE = dyn_cast<CallExpr>(DeclExp)) {
+      NumArgs = CE->getNumArgs();
+      FunArgs = CE->getArgs();
     } else if (CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(DeclExp)) {
       Parent = 0;  // FIXME -- get the parent from DeclStmt
       NumArgs = CE->getNumArgs();
@@ -350,7 +353,7 @@ public:
   void VisitUnaryOperator(UnaryOperator *UO);
   void VisitBinaryOperator(BinaryOperator *BO);
   void VisitCastExpr(CastExpr *CE);
-  void VisitCXXMemberCallExpr(CXXMemberCallExpr *Exp);
+  void VisitCallExpr(CallExpr *Exp);
   void VisitCXXConstructExpr(CXXConstructExpr *Exp);
   void VisitDeclStmt(DeclStmt *S);
 };
@@ -647,7 +650,7 @@ void BuildLockset::VisitCastExpr(CastExpr *CE) {
 }
 
 
-void BuildLockset::VisitCXXMemberCallExpr(CXXMemberCallExpr *Exp) {
+void BuildLockset::VisitCallExpr(CallExpr *Exp) {
   NamedDecl *D = dyn_cast_or_null<NamedDecl>(Exp->getCalleeDecl());
   if(!D || !D->hasAttrs())
     return;
index 23dcd8d4a8f7799c1c45bcfb8964e0d533e09577..8219b982bc719667130041f44506959ab05323c8 100644 (file)
@@ -1605,3 +1605,25 @@ struct TestScopedLockable {
 } // end namespace test_scoped_lockable
 
 
+namespace FunctionAttrTest {
+
+class Foo {
+public:
+  Mutex mu_;
+  int a GUARDED_BY(mu_);
+};
+
+Foo fooObj;
+
+void foo() EXCLUSIVE_LOCKS_REQUIRED(fooObj.mu_);
+
+void bar() {
+  foo();  // expected-warning {{calling function 'foo' requires exclusive lock on 'mu_'}}
+  fooObj.mu_.Lock();
+  foo();
+  fooObj.mu_.Unlock();
+}
+
+};  // end namespace FunctionAttrTest
+
+