]> granicus.if.org Git - clang/commitdiff
Bugfix: bogus warning -- "invalid use of non-static data member",
authorDeLesley Hutchins <delesley@google.com>
Sat, 25 Feb 2012 00:11:55 +0000 (00:11 +0000)
committerDeLesley Hutchins <delesley@google.com>
Sat, 25 Feb 2012 00:11:55 +0000 (00:11 +0000)
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

lib/Sema/SemaExprMember.cpp
test/SemaCXX/cxx0x-class.cpp
test/SemaCXX/warn-thread-safety-analysis.cpp

index 92cf619d92aae48e5d901ba5babf4c6fe4e634ac..54296942d0d4bcb7c90f65795c739e80d44bbe4d 100644 (file)
@@ -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);
 
index d5590c5e22de54080783165ad155f5e5e54309a5..41b0a5ce9589105a8b9d2b4d12c4ff181f67e931 100644 (file)
@@ -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;
+  };
+}
index 8bbaf0398fae3b9e041681d8e167ad2087ddc8c1..a7c1c00268548165d67d9732b4d072d204ed4b53 100644 (file)
@@ -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
+