summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-07-28 22:27:52 +0000
committerDouglas Gregor <dgregor@apple.com>2010-07-28 22:27:52 +0000
commita9c3e827554f98d3caf8f40f1fcfa8fdc47638e6 (patch)
tree47dc2ebe35a3ef1c2c58375e8c92a41165270454 /clang
parent4c1e484f39490d1fcb96369ecfb242e0ce17787d (diff)
downloadbcm5719-llvm-a9c3e827554f98d3caf8f40f1fcfa8fdc47638e6.tar.gz
bcm5719-llvm-a9c3e827554f98d3caf8f40f1fcfa8fdc47638e6.zip
Don't die when a member access refers to a non-class member via a
qualified name. Fixes <rdar://problem/8231724>. llvm-svn: 109682
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp3
-rw-r--r--clang/test/SemaCXX/member-expr.cpp14
2 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index fa2b65b2deb..b2f1a356dfb 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -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());
diff --git a/clang/test/SemaCXX/member-expr.cpp b/clang/test/SemaCXX/member-expr.cpp
index 6830c5fdafb..953ee48aa95 100644
--- a/clang/test/SemaCXX/member-expr.cpp
+++ b/clang/test/SemaCXX/member-expr.cpp
@@ -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'}}
+ }
+}
OpenPOWER on IntegriCloud