diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 8e14fcdd6b29..36ab6ed44bdb 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/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 &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(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(BaseRT->getDecl()); - if (!BaseRecord->isDefinition()) - return false; - if (!IsProvablyNotDerivedFrom(SemaRef, BaseRecord, Bases)) return false; } diff --git a/clang/test/SemaCXX/member-expr.cpp b/clang/test/SemaCXX/member-expr.cpp index cd13bcc3670e..9cd6855ccd55 100644 --- a/clang/test/SemaCXX/member-expr.cpp +++ b/clang/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(); + } + }; +}