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.ProblemFunctionType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; 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.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecIncomplete;
import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.Assert;
/** /**
@ -65,7 +66,9 @@ public class CPPClassSpecialization extends CPPSpecialization
implements ICPPMember, IRecursionResolvingBinding { implements ICPPMember, IRecursionResolvingBinding {
public static RecursionResolvingBinding createFor(IBinding original) { public static RecursionResolvingBinding createFor(IBinding original) {
IASTNode point = CPPSemantics.getCurrentLookupPoint(); 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()); return new RecursionResolvingMethod(point, original.getNameCharArray());
if (original instanceof ICPPField) if (original instanceof ICPPField)
return new RecursionResolvingField(point, original.getNameCharArray()); 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) { public RecursionResolvingMethod(IASTNode node, char[] arg) {
super(node, 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 ICPPClassSpecializationScope specScope;
private ObjectMap specializationMap = ObjectMap.EMPTY_MAP; private ObjectMap specializationMap = ObjectMap.EMPTY_MAP;
private ICPPBase[] bases; private ICPPBase[] bases;