diff options
author | DeLesley Hutchins <delesley@google.com> | 2012-02-25 00:11:55 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2012-02-25 00:11:55 +0000 |
commit | d08d599da101f3fe3fd79e853f1dcea6be89d7c2 (patch) | |
tree | cc8d697829e76273c8be625e49efceb438d2cf24 | |
parent | 4a59bc26b3f2d00055e24332c3164c894fafac27 (diff) |
Bugfix: bogus warning -- "invalid use of non-static data member",
when a class is forward declared, and the reference to the data
member in question does not occur within a method body.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151413 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaExprMember.cpp | 3 | ||||
-rw-r--r-- | test/SemaCXX/cxx0x-class.cpp | 11 | ||||
-rw-r--r-- | test/SemaCXX/warn-thread-safety-analysis.cpp | 14 |
3 files changed, 27 insertions, 1 deletions
diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index 92cf619d92..54296942d0 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -173,7 +173,8 @@ static IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef, // ...if C is not X or a base class of X, the class member access expression // is ill-formed. if (R.getNamingClass() && - contextClass != R.getNamingClass()->getCanonicalDecl() && + contextClass->getCanonicalDecl() != + R.getNamingClass()->getCanonicalDecl() && contextClass->isProvablyNotDerivedFrom(R.getNamingClass())) return (hasNonInstance ? IMA_Mixed_Unrelated : IMA_Error_Unrelated); diff --git a/test/SemaCXX/cxx0x-class.cpp b/test/SemaCXX/cxx0x-class.cpp index d5590c5e22..41b0a5ce95 100644 --- a/test/SemaCXX/cxx0x-class.cpp +++ b/test/SemaCXX/cxx0x-class.cpp @@ -26,3 +26,14 @@ namespace rdar8367341 { static constexpr float y2 = foo(); // expected-error {{must be initialized by a constant expression}} expected-note {{non-constexpr function 'foo'}} }; } + + +namespace Foo { + // Regression test -- forward declaration of Foo should not cause error about + // nonstatic data member. + class Foo; + class Foo { + int x; + int y = x; + }; +} diff --git a/test/SemaCXX/warn-thread-safety-analysis.cpp b/test/SemaCXX/warn-thread-safety-analysis.cpp index 8bbaf0398f..a7c1c00268 100644 --- a/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -2100,3 +2100,17 @@ public: } // end namespace SelfLockingTest +namespace InvalidNonstatic { + +// Forward decl here causes bogus "invalid use of non-static data member" +// on reference to mutex_ in guarded_by attribute. +class Foo; + +class Foo { + Mutex* mutex_; + + int foo __attribute__((guarded_by(mutex_))); +}; + +} // end namespace InvalidNonStatic + |