1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 01:15:29 +02:00

Bug 418479 - IllegalArgumentException on template alias member of

template class
This commit is contained in:
Sergey Prigogin 2013-10-02 12:17:43 -07:00
parent 3852941d5c
commit 19db352cb9
4 changed files with 46 additions and 1 deletions

View file

@ -48,6 +48,7 @@ import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAliasDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
@ -333,6 +334,8 @@ public class CModelBuilder2 implements IContributedModelBuilder {
// TODO [cmodel] template specialization?
} else if (declaration instanceof ICPPASTExplicitTemplateInstantiation) {
// TODO [cmodel] explicit template instantiation?
} else if (declaration instanceof ICPPASTAliasDeclaration) {
// TODO [cmodel] alias declaration?
} else if (declaration instanceof ICPPASTUsingDeclaration) {
createUsingDeclaration(parent, (ICPPASTUsingDeclaration) declaration);
} else if (declaration instanceof ICPPASTUsingDirective) {
@ -399,6 +402,8 @@ public class CModelBuilder2 implements IContributedModelBuilder {
setBodyPosition((SourceManipulation)element, templateDeclaration);
}
}
} else if (declaration instanceof ICPPASTAliasDeclaration) {
createDeclaration(parent, declaration);
} else if (declaration instanceof ICPPASTTemplateDeclaration) {
// strange: template decl inside template decl
createTemplateDeclaration(parent, (ICPPASTTemplateDeclaration) declaration);

View file

@ -17,13 +17,17 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
@ -88,6 +92,16 @@ public class AccessContext {
if (binding instanceof ICPPMember) {
bindingVisibility = ((ICPPMember) binding).getVisibility();
} else {
while (binding instanceof ICPPSpecialization) {
binding = ((ICPPSpecialization) binding).getSpecializedBinding();
}
if (binding instanceof ICPPClassTemplatePartialSpecialization) {
// A class template partial specialization inherits the visibility of its primary class template.
binding = ((ICPPClassTemplatePartialSpecialization) binding).getPrimaryClassTemplate();
}
if (binding instanceof ICPPAliasTemplateInstance) {
binding = ((ICPPAliasTemplateInstance) binding).getTemplateDefinition();
}
IBinding owner = binding.getOwner();
if (owner instanceof ICPPClassType) {
bindingVisibility = ((ICPPClassType) owner).getVisibility(binding);
@ -152,7 +166,9 @@ public class AccessContext {
return false;
accessLevel = getMemberAccessLevel(derivedClass, accessLevel);
if (owner.isSameType(derivedClass)) {
if (owner.isSameType(derivedClass) ||
(derivedClass instanceof ICPPClassSpecialization &&
owner.equals(((ICPPClassSpecialization) derivedClass).getSpecializedBinding()))) {
return isAccessible(bindingVisibility, accessLevel);
}

View file

@ -519,6 +519,9 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
if (binding instanceof ICPPClassTemplatePartialSpecialization) {
// A class template partial specialization inherits the visibility of its primary class template.
binding = ((ICPPClassTemplatePartialSpecialization) binding).getPrimaryClassTemplate();
}
if (binding instanceof ICPPAliasTemplateInstance) {
binding = ((ICPPAliasTemplateInstance) binding).getTemplateDefinition();
}
if (binding instanceof CPPImplicitMethod)
return ICPPClassType.v_public;

View file

@ -659,6 +659,27 @@ public class CompletionTests extends AbstractContentAssistTest {
assertCompletionResults(fCursorOffset, expected, AbstractContentAssistTest.COMPARE_ID_STRINGS);
}
// struct A {};
//
// template<typename T>
// struct B {};
//
// template<typename U>
// struct C {
// using D = U;
//
// template<typename T>
// using E = B<T>;
// };
//
// void test() {
// C<A>::/*cursor*/
// }
public void testAliasTemplate_418479() throws Exception {
final String[] expected = { "D", "E" };
assertContentAssistResults(fCursorOffset, expected, true, COMPARE_ID_STRINGS);
}
//using namespace ns;void gfunc(){NSC/*cursor*/
public void testUsingDirective() throws Exception {
final String[] expected= { "NSCONST" };