diff options
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 10 | ||||
-rw-r--r-- | test/SemaCXX/member-expr.cpp | 15 |
2 files changed, 20 insertions, 5 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 8e14fcdd6b..36ab6ed44b 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -711,10 +711,13 @@ static bool IsDependentIdExpression(Sema &SemaRef, const CXXScopeSpec &SS) { static bool IsProvablyNotDerivedFrom(Sema &SemaRef, CXXRecordDecl *Record, const llvm::SmallPtrSet<CXXRecordDecl*, 4> &Bases) { - Record = Record->getCanonicalDecl(); - if (Bases.count(Record)) + if (Bases.count(Record->getCanonicalDecl())) return false; + RecordDecl *RD = Record->getDefinition(SemaRef.Context); + if (!RD) return false; + Record = cast<CXXRecordDecl>(RD); + for (CXXRecordDecl::base_class_iterator I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) { CanQualType BaseT = SemaRef.Context.getCanonicalType((*I).getType()); @@ -722,9 +725,6 @@ static bool IsProvablyNotDerivedFrom(Sema &SemaRef, if (!BaseRT) return false; CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl()); - if (!BaseRecord->isDefinition()) - return false; - if (!IsProvablyNotDerivedFrom(SemaRef, BaseRecord, Bases)) return false; } diff --git a/test/SemaCXX/member-expr.cpp b/test/SemaCXX/member-expr.cpp index cd13bcc367..9cd6855ccd 100644 --- a/test/SemaCXX/member-expr.cpp +++ b/test/SemaCXX/member-expr.cpp @@ -41,3 +41,18 @@ void test2(X *xp) { xp->::i = 7; // expected-error{{qualified member access refers to a member in the global namespace}} xp->C::i = 7; // expected-error{{qualified member access refers to a member in namespace 'C'}} } + + +namespace test3 { + struct NamespaceDecl; + + struct NamedDecl { + void *getIdentifier() const; + }; + + struct NamespaceDecl : NamedDecl { + bool isAnonymousNamespace() const { + return !getIdentifier(); + } + }; +} |