diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java index 34c729dfab2..96c3ccc0fc2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java @@ -38,6 +38,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNameSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; @@ -342,6 +343,11 @@ public class CPPASTQualifiedName extends CPPASTNameBase return bindings; } + // Are we inside a using-declaration? + private boolean inUsingDecl() { + return getParent() instanceof ICPPASTUsingDeclaration; + } + private boolean canBeFieldAccess(ICPPClassType baseClass) { IASTNode parent= getParent(); if (parent instanceof IASTFieldReference) { @@ -368,14 +374,14 @@ public class CPPASTQualifiedName extends CPPASTNameBase private List filterClassScopeBindings(ICPPClassType classType, IBinding[] bindings, final boolean isDeclaration) { List filtered = new ArrayList(); - final boolean canBeFieldAccess = canBeFieldAccess(classType); + final boolean allowNonstatic = canBeFieldAccess(classType) || inUsingDecl(); final IBinding templateDefinition = (classType instanceof ICPPTemplateInstance) ? ((ICPPTemplateInstance) classType).getTemplateDefinition() : null; for (final IBinding binding : bindings) { if (binding instanceof IField) { IField field = (IField) binding; - if (!canBeFieldAccess && !field.isStatic()) + if (!allowNonstatic && !field.isStatic()) continue; } else if (binding instanceof ICPPMethod) { ICPPMethod method = (ICPPMethod) binding; @@ -383,7 +389,7 @@ public class CPPASTQualifiedName extends CPPASTNameBase continue; if (!isDeclaration) { if (method.isDestructor() || method instanceof ICPPConstructor - || (!canBeFieldAccess && !method.isStatic())) + || (!allowNonstatic && !method.isStatic())) continue; } } else if (binding instanceof IEnumerator || binding instanceof IEnumeration) { diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index a7d8ee440bc..18f16f38276 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -1255,6 +1255,23 @@ public class CompletionTests extends CompletionTestBase { assertCompletionResults(fCursorOffset, expected, REPLACEMENT); } + // class Base { + // private: + // void priv(); + // protected: + // void prot(); + // public: + // void publ(); + // }; + // class Derived : Base { + // using Base::/*cursor*/ + // }; + public void testUsingDeclarationInClass_511048() throws Exception { + final String[] expected = { "prot(void)", "publ(void)" }; + assertCompletionResults(fCursorOffset, expected, ID); + } + + // template