From 031938d831ff1e15843a4a14520205cf9b36760c Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Tue, 3 Jan 2017 18:07:59 -0500 Subject: [PATCH] Bug 509871 - ClassCastException in EvalConstructor.computeForFunctionCall() Change-Id: If4b7dac7a6665619f80a57ebfe83ce8749b7dd9c --- .../tests/IndexCPPBindingResolutionTest.java | 20 +++++++++++++++++++ .../dom/ast/cpp/ICPPClassSpecialization.java | 2 +- .../core/dom/parser/cpp/ClassTypeHelper.java | 8 ++++---- .../parser/cpp/semantics/EvalConstructor.java | 2 +- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java index fb158e39842..69556dc8e4a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java @@ -2418,4 +2418,24 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas public void testAnonymousStructInAnonymousNamespace_508254() throws Exception { checkBindings(); } + + // struct base { + // int* ptr; + // }; + // + // struct shared_ptr : public base { + // constexpr shared_ptr() {} + // constexpr shared_ptr(int) : shared_ptr() {} + // }; + // + // struct Foo { + // shared_ptr m_variable = 0; + // }; + + // int main() { + // Foo a; // Error: Type 'Foo' could not be resolved + // } + public void testDelegatingConstructorCallInConstexprConstructor_509871() throws Exception { + checkBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java index 0a3f0cf7136..8b315a0db6d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java @@ -90,7 +90,7 @@ public interface ICPPClassSpecialization extends ICPPTypeSpecialization, ICPPCla IBinding[] getFriends(IASTNode point); /** - * Similar to {@link ICPPClassType#getFriends()} but a accepts a starting point + * Similar to {@link ICPPClassType#getFields()} but a accepts a starting point * for template instantiation. * @since 5.5 */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index c7b7ff51042..18037542ec4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -647,13 +647,13 @@ public class ClassTypeHelper { } - public static IField[] getFields(ICPPClassType ct, IASTNode point) { - IField[] fields = getDeclaredFields(ct, point); + public static ICPPField[] getFields(ICPPClassType ct, IASTNode point) { + ICPPField[] fields = getDeclaredFields(ct, point); ICPPClassType[] bases = getAllBases(ct, point); for (ICPPClassType base : bases) { - fields = ArrayUtil.addAll(IField.class, fields, getDeclaredFields(base, point)); + fields = ArrayUtil.addAll(ICPPField.class, fields, getDeclaredFields(base, point)); } - return ArrayUtil.trim(IField.class, fields); + return ArrayUtil.trim(ICPPField.class, fields); } public static IField findField(ICPPClassType ct, String name) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalConstructor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalConstructor.java index fc6c22e2302..6339c3c0eae 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalConstructor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalConstructor.java @@ -158,7 +158,7 @@ public final class EvalConstructor extends CPPDependentEvaluation { ICPPEvaluation memberValue = memberEval.computeForFunctionCall(localRecord, context.recordStep()); ICPPEvaluation[] baseClassValues = memberValue.getValue(context.getPoint()).getAllSubValues(); - ICPPField[] baseFields = (ICPPField[]) ClassTypeHelper.getFields(baseClassType, context.getPoint()); + ICPPField[] baseFields = ClassTypeHelper.getFields(baseClassType, context.getPoint()); for (ICPPField baseField : baseFields) { // TODO: This has the same problem with multiple inheritance as // CompositeValue.create(ICPPClassType).