Author: rjmccall Date: Wed Sep 9 18:04:17 2015 New Revision: 247207 URL: http://llvm.org/viewvc/llvm-project?rev=247207&view=rev Log: Fix access control for lookups using the Microsoft __super extension.
rdar://22464808 Added: cfe/trunk/test/SemaCXX/microsoft-super.cpp Modified: cfe/trunk/lib/Sema/SemaLookup.cpp Modified: cfe/trunk/lib/Sema/SemaLookup.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=247207&r1=247206&r2=247207&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaLookup.cpp (original) +++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed Sep 9 18:04:17 2015 @@ -2098,17 +2098,30 @@ bool Sema::LookupParsedName(LookupResult /// /// @returns True if any decls were found (but possibly ambiguous) bool Sema::LookupInSuper(LookupResult &R, CXXRecordDecl *Class) { + // The access-control rules we use here are essentially the rules for + // doing a lookup in Class that just magically skipped the direct + // members of Class itself. That is, the naming class is Class, and the + // access includes the access of the base. for (const auto &BaseSpec : Class->bases()) { CXXRecordDecl *RD = cast<CXXRecordDecl>( BaseSpec.getType()->castAs<RecordType>()->getDecl()); LookupResult Result(*this, R.getLookupNameInfo(), R.getLookupKind()); Result.setBaseObjectType(Context.getRecordType(Class)); LookupQualifiedName(Result, RD); - for (auto *Decl : Result) - R.addDecl(Decl); + + // Copy the lookup results into the target, merging the base's access into + // the path access. + for (auto I = Result.begin(), E = Result.end(); I != E; ++I) { + R.addDecl(I.getDecl(), + CXXRecordDecl::MergeAccess(BaseSpec.getAccessSpecifier(), + I.getAccess())); + } + + Result.suppressDiagnostics(); } R.resolveKind(); + R.setNamingClass(Class); return !R.empty(); } Added: cfe/trunk/test/SemaCXX/microsoft-super.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/microsoft-super.cpp?rev=247207&view=auto ============================================================================== --- cfe/trunk/test/SemaCXX/microsoft-super.cpp (added) +++ cfe/trunk/test/SemaCXX/microsoft-super.cpp Wed Sep 9 18:04:17 2015 @@ -0,0 +1,49 @@ +// RUN: %clang_cc1 -fms-extensions -verify %s + +// rdar://22464808 + +namespace test0 { + class A { + private: + void foo(int*); + public: + void foo(long*); + }; + class B : public A { + void test() { + __super::foo((long*) 0); + } + }; +} + +namespace test1 { + struct A { + static void foo(); // expected-note {{member is declared here}} + }; + struct B : private A { // expected-note {{constrained by private inheritance here}} + void test() { + __super::foo(); + } + }; + struct C : public B { + void test() { + __super::foo(); // expected-error {{'foo' is a private member of 'test1::A'}} + } + }; +} + +namespace test2 { + struct A { + static void foo(); + }; + struct B : public A { + void test() { + __super::foo(); + } + }; + struct C : private B { + void test() { + __super::foo(); + } + }; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits