summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/TreeTransform.h5
-rw-r--r--clang/test/SemaCXX/warn-thread-safety-analysis.cpp21
2 files changed, 26 insertions, 0 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 03a1d78aa01..b4073eb650e 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -1485,6 +1485,11 @@ public:
ExprResult BaseResult = getSema().DefaultFunctionArrayConversion(Base);
if (BaseResult.isInvalid())
return ExprError();
+ if (isArrow) {
+ BaseResult = getSema().DefaultLvalueConversion(BaseResult.get());
+ if (BaseResult.isInvalid())
+ return ExprError();
+ }
Base = BaseResult.take();
QualType BaseType = Base->getType();
diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
index 7adead763ee..83e0ff08b9e 100644
--- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -1509,4 +1509,25 @@ void foo() {
} // end namespace invalid_lock_expression_test
+namespace template_member_test {
+ struct S { int n; };
+ struct T {
+ Mutex m;
+ S *s GUARDED_BY(this->m);
+ };
+
+ template<typename U>
+ struct IndirectLock {
+ int DoNaughtyThings(T *t) {
+ return t->s->n; // expected-warning {{reading variable 's' requires locking 'm'}}
+ }
+ };
+
+ struct MutexWrapper {
+ typedef Mutex Lock;
+ };
+
+ template struct IndirectLock<MutexWrapper>; // expected-note {{here}}
+
+}
OpenPOWER on IntegriCloud