Index: lib/Sema/SemaDeclCXX.cpp =================================================================== --- lib/Sema/SemaDeclCXX.cpp +++ lib/Sema/SemaDeclCXX.cpp @@ -7164,28 +7164,29 @@ if (!getLangOpts().CPlusPlus11 && CurContext->isRecord()) { DeclContext *OrigDC = Orig->getDeclContext(); - // Handle enums and anonymous structs. + if (OrigDC->isRecord()) { + // Handle enums and anonymous structs. if (isa(OrigDC)) OrigDC = OrigDC->getParent(); - CXXRecordDecl *OrigRec = cast(OrigDC); - while (OrigRec->isAnonymousStructOrUnion()) - OrigRec = cast(OrigRec->getDeclContext()); + CXXRecordDecl *OrigRec = cast(OrigDC); + while (OrigRec->isAnonymousStructOrUnion()) + OrigRec = cast(OrigRec->getDeclContext()); + + if (cast(CurContext)->isProvablyNotDerivedFrom(OrigRec)) { + if (OrigDC == CurContext) { + Diag(Using->getLocation(), + diag::err_using_decl_nested_name_specifier_is_current_class) + << Using->getQualifierLoc().getSourceRange(); + Diag(Orig->getLocation(), diag::note_using_decl_target); + return true; + } - if (cast(CurContext)->isProvablyNotDerivedFrom(OrigRec)) { - if (OrigDC == CurContext) { - Diag(Using->getLocation(), - diag::err_using_decl_nested_name_specifier_is_current_class) - << Using->getQualifierLoc().getSourceRange(); + Diag(Using->getQualifierLoc().getBeginLoc(), + diag::err_using_decl_nested_name_specifier_is_not_base_class) + << Using->getQualifier() << cast(CurContext) + << Using->getQualifierLoc().getSourceRange(); Diag(Orig->getLocation(), diag::note_using_decl_target); return true; } - - Diag(Using->getQualifierLoc().getBeginLoc(), - diag::err_using_decl_nested_name_specifier_is_not_base_class) - << Using->getQualifier() - << cast(CurContext) - << Using->getQualifierLoc().getSourceRange(); - Diag(Orig->getLocation(), diag::note_using_decl_target); - return true; } } Index: test/SemaCXX/using-decl-2.cpp =================================================================== --- /dev/null +++ test/SemaCXX/using-decl-2.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +struct A { + A(); +}; + +typedef struct { + A i; +} S; // expected-note {{declared here}} + +struct B : S { + using S::S; // expected-error {{no member named 'S' in 'S'}} +};