diff options
-rw-r--r-- | clang/lib/Sema/SemaExprMember.cpp | 8 | ||||
-rw-r--r-- | clang/test/SemaCXX/using-decl-1.cpp | 13 |
2 files changed, 17 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index 52dfceccb94..9c345f8a69a 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -102,8 +102,9 @@ static IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef, bool hasNonInstance = false; bool isField = false; BaseSet Classes; - for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) { - NamedDecl *D = *I; + for (NamedDecl *D : R) { + // Look through any using decls. + D = D->getUnderlyingDecl(); if (D->isCXXInstanceMember()) { isField |= isa<FieldDecl>(D) || isa<MSPropertyDecl>(D) || @@ -111,8 +112,7 @@ static IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef, CXXRecordDecl *R = cast<CXXRecordDecl>(D->getDeclContext()); Classes.insert(R->getCanonicalDecl()); - } - else + } else hasNonInstance = true; } diff --git a/clang/test/SemaCXX/using-decl-1.cpp b/clang/test/SemaCXX/using-decl-1.cpp index ca532692c1c..5afd15f8b50 100644 --- a/clang/test/SemaCXX/using-decl-1.cpp +++ b/clang/test/SemaCXX/using-decl-1.cpp @@ -327,3 +327,16 @@ namespace PR24033 { using PR24033::st; // expected-error {{target of using declaration conflicts with declaration already in scope}} } } + +namespace field_use { +struct A { int field; }; +struct B : A { + // Previously Clang rejected this valid C++11 code because it didn't look + // through the UsingShadowDecl. + using A::field; +#if __cplusplus < 201103L + // expected-error@+2 {{invalid use of non-static data member 'field'}} +#endif + enum { X = sizeof(field) }; +}; +} |