diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AccessControlTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AccessControlTests.java index 922026b0dce..503b0efa1a5 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AccessControlTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AccessControlTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Google, Inc and others. + * Copyright (c) 2009, 2013 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -51,13 +51,21 @@ public class AccessControlTests extends AST2TestBase { return suite(AccessControlTests.class); } + private AccessAssertionHelper getAssertionHelper() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + return new AccessAssertionHelper(code); + } + // class A { // public: // int a; + // typedef char E; // }; // class B : private A { // friend void test(); // int b; + // typedef char* F; // }; // class C : protected B { // }; @@ -66,25 +74,35 @@ public class AccessControlTests extends AST2TestBase { // void m() { // a; //1 // b; //1 + // E(); //1 + // F(); //1 // } // }; // B b; // b.a; //2 // b.b; //2 + // B::E(); //2 + // B::F(); //2 // C c; // c.a; //3 // c.b; //3 + // C::E(); //3 + // C::F(); //3 // } public void testFriends() throws Exception { - final String code = getAboveComment(); - parseAndCheckBindings(code, ParserLanguage.CPP); - AccessAssertionHelper ah= new AccessAssertionHelper(code); + AccessAssertionHelper ah = getAssertionHelper(); ah.assertAccessible("a; //1", 1); ah.assertAccessible("b; //1", 1); + ah.assertAccessible("E(); //1", 1); + ah.assertAccessible("F(); //1", 1); ah.assertAccessible("a; //2", 1); ah.assertAccessible("b; //2", 1); + ah.assertAccessible("E(); //2", 1); + ah.assertAccessible("F(); //2", 1); ah.assertNotAccessible("a; //3", 1); ah.assertNotAccessible("b; //3", 1); + ah.assertNotAccessible("E(); //3", 1); + ah.assertNotAccessible("F(); //3", 1); } // class A { @@ -101,9 +119,7 @@ public class AccessControlTests extends AST2TestBase { // x.a = 0; // } public void testHiddenMember() throws Exception { - final String code = getAboveComment(); - parseAndCheckBindings(code, ParserLanguage.CPP); - AccessAssertionHelper ah= new AccessAssertionHelper(code); + AccessAssertionHelper ah = getAssertionHelper(); ah.assertNotAccessible("a = 0", 1); } @@ -120,9 +136,7 @@ public class AccessControlTests extends AST2TestBase { // }; // }; public void testEnclosingAsNamingClass_292232() throws Exception { - final String code = getAboveComment(); - parseAndCheckBindings(code, ParserLanguage.CPP); - AccessAssertionHelper ah= new AccessAssertionHelper(code); + AccessAssertionHelper ah = getAssertionHelper(); ah.assertAccessible("Ex a;", 2); } @@ -147,9 +161,7 @@ public class AccessControlTests extends AST2TestBase { // bp->mi=5; // } public void testEnclosingAsNamingClass_292232a() throws Exception { - final String code = getAboveComment(); - parseAndCheckBindings(code, ParserLanguage.CPP); - AccessAssertionHelper ah= new AccessAssertionHelper(code); + AccessAssertionHelper ah = getAssertionHelper(); ah.assertNotAccessible("mi=3;", 2); ah.assertNotAccessible("si=3;", 2); ah.assertAccessible("mi=4;", 2); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java index 7d6a236b90d..3793c5aae5e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java @@ -88,8 +88,12 @@ public class AccessContext { if (binding instanceof ICPPMember) { bindingVisibility = ((ICPPMember) binding).getVisibility(); } else { - // TODO(sprigogin): Handle visibility of nested types - bindingVisibility = v_public; + IBinding owner = binding.getOwner(); + if (owner instanceof ICPPClassType) { + bindingVisibility = ((ICPPClassType) owner).getVisibility(binding); + } else { + bindingVisibility = v_public; + } } return isAccessible(binding, bindingVisibility); }