diff options
| author | DeLesley Hutchins <delesley@google.com> | 2013-02-07 19:01:07 +0000 |
|---|---|---|
| committer | DeLesley Hutchins <delesley@google.com> | 2013-02-07 19:01:07 +0000 |
| commit | eb849c6bd5cd39369ba7078c03447b371d73db71 (patch) | |
| tree | a372084c34c8d61140ccd12da1a55b9d7e7c95bb /clang | |
| parent | 37fea69391468fac9ba32ac6c717c25eb0f670d1 (diff) | |
| download | bcm5719-llvm-eb849c6bd5cd39369ba7078c03447b371d73db71.tar.gz bcm5719-llvm-eb849c6bd5cd39369ba7078c03447b371d73db71.zip | |
Thread safety analysis: make sure that expressions in attributes are parsed
in an unevaluated context.
llvm-svn: 174644
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 1 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 8e24a14d0b9..14fd581ddcb 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -1023,6 +1023,7 @@ void Parser::ParseThreadSafetyAttribute(IdentifierInfo &AttrName, // now parse the list of expressions while (Tok.isNot(tok::r_paren)) { + EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated); ExprResult ArgExpr(ParseAssignmentExpression()); if (ArgExpr.isInvalid()) { ArgExprsOk = false; diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index 26a3df0ef3d..3f41124d47a 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -3902,3 +3902,16 @@ class Foo { } // end namespace TestThrowExpr +namespace UnevaluatedContextTest { + +// parse attribute expressions in an unevaluated context. + +static inline Mutex* getMutex1(); +static inline Mutex* getMutex2(); + +void bar() EXCLUSIVE_LOCKS_REQUIRED(getMutex1()); + +void bar2() EXCLUSIVE_LOCKS_REQUIRED(getMutex1(), getMutex2()); + +} // end namespace UnevaluatedContextTest + |

