diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 1013bfc575747..a7b3489a4162b 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -4129,7 +4129,7 @@ def NoThreadSafetyAnalysis : InheritableAttr { } def GuardedBy : InheritableAttr { - let Spellings = [GNU<"guarded_by">]; + let Spellings = [Clang<"guarded_by", 0>]; let Args = [ExprArgument<"Arg">]; let LateParsed = LateAttrParseExperimentalExt; let TemplateDependent = 1; diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp index ef48ae439c5f3..89a3087a59247 100644 --- a/clang/lib/Analysis/ThreadSafetyCommon.cpp +++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp @@ -394,6 +394,13 @@ til::SExpr *SExprBuilder::translateDeclRefExpr(const DeclRefExpr *DRE, if (const auto *VarD = dyn_cast(VD)) return translateVariable(VarD, Ctx); + if (const auto *FD = dyn_cast(VD)) { + if (Ctx && Ctx->SelfArg) { + til::SExpr *E = new (Arena) til::SApply(SelfVar); + return new (Arena) til::Project(E, FD); + } + } + // For non-local variables, treat it as a reference to a named object. return new (Arena) til::LiteralPtr(VD); } diff --git a/clang/test/SemaCXX/gh158116.cpp b/clang/test/SemaCXX/gh158116.cpp new file mode 100644 index 0000000000000..206eb57ba9fea --- /dev/null +++ b/clang/test/SemaCXX/gh158116.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety -std=c++11 %s + +class __attribute__((lockable)) Mutex { +public: + void lock() __attribute__((exclusive_lock_function)); + void unlock() __attribute__((unlock_function)); +}; + +class Foo { + Mutex mu; + int y __attribute__((guarded_by(mu))); + int z [[clang::guarded_by(mu)]]; + + void func1() { + y = 0; // expected-warning{{writing variable 'y' requires holding}} + z = 1; // expected-warning{{writing variable 'z' requires holding}} + } + + void func2() { + mu.lock(); + y = 2; + z = 3; + mu.unlock(); + } +}; diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index 0e91639a271c5..f68699f701851 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -3590,14 +3590,10 @@ void requireDecl(RelockableScope &scope) { struct foo { Mutex mu; - // expected-note@+1{{see attribute on parameter here}} void require(RelockableScope &scope EXCLUSIVE_LOCKS_REQUIRED(mu)); void callRequire(){ RelockableScope scope(&mu); - // TODO: False positive due to incorrect parsing of parameter attribute arguments. require(scope); - // expected-warning@-1{{calling function 'require' requires holding mutex 'mu' exclusively}} - // expected-warning@-2{{mutex managed by 'scope' is 'mu' instead of 'mu'}} } };