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:
parent
3852941d5c
commit
19db352cb9
4 changed files with 46 additions and 1 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" };
|
||||
|
|
Loading…
Add table
Reference in a new issue