From 77852e7357230e3c956f50f559bcc491569dfc0f Mon Sep 17 00:00:00 2001 From: DeLesley Hutchins <delesley@google.com> Date: Thu, 23 Jan 2014 22:35:26 +0000 Subject: [PATCH] Thread safety analysis: handle duplicate assert_lock attributes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199949 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/Attr.td | 2 ++ test/SemaCXX/warn-thread-safety-analysis.cpp | 21 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index 31435485ef7..9e23afcca36 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -1180,6 +1180,7 @@ def AssertExclusiveLock : InheritableAttr { let LateParsed = 1; let TemplateDependent = 1; let ParseArgumentsAsUnevaluated = 1; + let DuplicatesAllowedWhileMerging = 1; let Subjects = SubjectList<[FunctionDefinition, FunctionTemplate]>; } @@ -1189,6 +1190,7 @@ def AssertSharedLock : InheritableAttr { let LateParsed = 1; let TemplateDependent = 1; let ParseArgumentsAsUnevaluated = 1; + let DuplicatesAllowedWhileMerging = 1; let Subjects = SubjectList<[FunctionDefinition, FunctionTemplate]>; } diff --git a/test/SemaCXX/warn-thread-safety-analysis.cpp b/test/SemaCXX/warn-thread-safety-analysis.cpp index 6b0159064be..7c0a73327b8 100644 --- a/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -3616,8 +3616,14 @@ class Foo { EXCLUSIVE_TRYLOCK_FUNCTION(true, mu2_); bool readertrylock() SHARED_TRYLOCK_FUNCTION(true, mu1_) SHARED_TRYLOCK_FUNCTION(true, mu2_); + void assertBoth() ASSERT_EXCLUSIVE_LOCK(mu1_) + ASSERT_EXCLUSIVE_LOCK(mu2_); + void assertShared() ASSERT_SHARED_LOCK(mu1_) + ASSERT_SHARED_LOCK(mu2_); void test(); + void testAssert(); + void testAssertShared(); }; @@ -3676,6 +3682,21 @@ void Foo::test() { } } +// Force duplication of attributes +void Foo::assertBoth() { } +void Foo::assertShared() { } + +void Foo::testAssert() { + assertBoth(); + a = 0; + b = 0; +} + +void Foo::testAssertShared() { + assertShared(); + int zz = a + b; +} + } // end namespace MultipleAttributeTest -- GitLab