From f65e93596eae67ec554c395903ecca1a1e4b2f02 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 20 Jun 2019 20:12:19 -0400 Subject: [PATCH] Bug 548482 - Add CPPClassSpecialization.RecursionResolvingConstructor This avoids an ArrayStoreException in specializeMembers(). Change-Id: I88a92462ef1ace4e99a0b45a9ba5975c705dab67 --- .../parser/cpp/CPPClassSpecialization.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index 39b5ea68087..174e0e260f8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -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;