1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 548482 - Add CPPClassSpecialization.RecursionResolvingConstructor

This avoids an ArrayStoreException in specializeMembers().

Change-Id: I88a92462ef1ace4e99a0b45a9ba5975c705dab67
This commit is contained in:
Nathan Ridge 2019-06-20 20:12:19 -04:00
parent 6b435e1faf
commit f65e93596e

View file

@ -53,6 +53,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.dom.parser.ProblemFunctionType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecIncomplete;
import org.eclipse.core.runtime.Assert;
/**
@ -65,7 +66,9 @@ public class CPPClassSpecialization extends CPPSpecialization
implements ICPPMember, IRecursionResolvingBinding {
public static RecursionResolvingBinding createFor(IBinding original) {
IASTNode point = CPPSemantics.getCurrentLookupPoint();
if (original instanceof ICPPMethod)
if (original instanceof ICPPConstructor)
return new RecursionResolvingConstructor(point, original.getNameCharArray());
else if (original instanceof ICPPMethod)
return new RecursionResolvingMethod(point, original.getNameCharArray());
if (original instanceof ICPPField)
return new RecursionResolvingField(point, original.getNameCharArray());
@ -104,7 +107,7 @@ public class CPPClassSpecialization extends CPPSpecialization
}
}
public final static class RecursionResolvingMethod extends RecursionResolvingBinding implements ICPPMethod {
public static class RecursionResolvingMethod extends RecursionResolvingBinding implements ICPPMethod {
public RecursionResolvingMethod(IASTNode node, char[] arg) {
super(node, arg);
}
@ -160,6 +163,24 @@ public class CPPClassSpecialization extends CPPSpecialization
}
}
public final static class RecursionResolvingConstructor extends RecursionResolvingMethod
implements ICPPConstructor {
public RecursionResolvingConstructor(IASTNode node, char[] arg) {
super(node, arg);
}
@Override
public ICPPExecution getConstructorChainExecution(IASTNode point) {
return getConstructorChainExecution();
}
@Override
public ICPPExecution getConstructorChainExecution() {
return ExecIncomplete.INSTANCE;
}
}
private ICPPClassSpecializationScope specScope;
private ObjectMap specializationMap = ObjectMap.EMPTY_MAP;
private ICPPBase[] bases;