]> granicus.if.org Git - clang/commitdiff
Don't die when a member access refers to a non-class member via a
authorDouglas Gregor <dgregor@apple.com>
Wed, 28 Jul 2010 22:27:52 +0000 (22:27 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 28 Jul 2010 22:27:52 +0000 (22:27 +0000)
qualified name. Fixes <rdar://problem/8231724>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109682 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaCXX/member-expr.cpp

index fa2b65b2deb2fa395f3c760e4150df42107ad022..b2f1a356dfb3b791a57394a0a9f8f287ba39cd81 100644 (file)
@@ -2632,6 +2632,9 @@ bool Sema::CheckQualifiedMemberReference(Expr *BaseExpr,
     while (DC->isTransparentContext())
       DC = DC->getParent();
 
+    if (!DC->isRecord())
+      continue;
+    
     llvm::SmallPtrSet<CXXRecordDecl*,4> MemberRecord;
     MemberRecord.insert(cast<CXXRecordDecl>(DC)->getCanonicalDecl());
 
index 6830c5fdafb7781de21b917ca97ab4c04ac3a1d7..953ee48aa959a305de60fd8ece201ee8f7915ff6 100644 (file)
@@ -101,3 +101,17 @@ namespace PR7508 {
     a.PopCleanupScope(); // expected-error{{no member named 'PopCleanupScope' in 'PR7508::A'}}
   }
 }
+
+namespace rdar8231724 {
+  namespace N {
+    template<typename T> struct X1;
+    int i;
+  }
+
+  struct X { };
+  struct Y : X { };
+
+  void f(Y *y) {
+    y->N::X1<int>; // expected-error{{'rdar8231724::N::X1' is not a member of class 'rdar8231724::Y'}}
+  }
+}