diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java index 29845b5d6d5..d9c0ce0d8fb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; @@ -51,6 +52,8 @@ public class ASTInternal { if (binding instanceof ICInternalBinding) { return ((ICInternalBinding) binding).getDefinition(); } + CCorePlugin.log("ASTInternal.getDefinitionOfBinding() called for binding of type " + //$NON-NLS-1$ + binding.getClass().getName()); assert false; return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java index 0f439c4b083..009c1f92972 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.internal.core.dom.parser; import java.util.HashSet; import java.util.Set; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; @@ -29,6 +31,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalInitList; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalUtil; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; public final class CompositeValue implements IValue { private final ICPPEvaluation evaluation; @@ -226,7 +229,12 @@ public final class CompositeValue implements IValue { @Override public void setSubValue(int position, ICPPEvaluation newValue) { - values[position] = newValue == null ? EvalFixed.INCOMPLETE : newValue; + if (position >= 0 && position < values.length) { + values[position] = newValue == null ? EvalFixed.INCOMPLETE : newValue; + } else { + CCorePlugin.log(IStatus.WARNING, "Out-of-bounds access to composite value: " + position + //$NON-NLS-1$ + " (length is " + values.length + ")"); //$NON-NLS-1$//$NON-NLS-2$ + } } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructor.java index a5a27245664..158bb54d1d9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructor.java @@ -17,6 +17,7 @@ import java.util.Map; import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; @@ -27,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalConstructor; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalTypeId; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecConstructorChain; @@ -46,13 +48,16 @@ public class CPPConstructor extends CPPMethod implements ICPPConstructor { if (initializer instanceof ICPPEvaluationOwner) { return ((ICPPEvaluationOwner) initializer).getEvaluation(); } else if (initializer instanceof ICPPASTConstructorInitializer) { - ICPPConstructor constructor = (ICPPConstructor) CPPSemantics.findImplicitlyCalledConstructor(chainInitializer); + IBinding constructor = CPPSemantics.findImplicitlyCalledConstructor(chainInitializer); if (constructor == null) { boolean usesBracedInitList = (initializer instanceof ICPPASTInitializerList); return new EvalTypeId(member.getType(), point, usesBracedInitList, EvalConstructor.extractArguments(initializer)); + } else if (constructor instanceof IProblemBinding) { + return EvalFixed.INCOMPLETE; } - return new EvalConstructor(member.getType(), constructor, EvalConstructor.extractArguments(initializer), point); + return new EvalConstructor(member.getType(), (ICPPConstructor) constructor, + EvalConstructor.extractArguments(initializer), point); } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java index 791382557cf..ec6fa6211c5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java @@ -16,13 +16,14 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.InstantiationContext; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFunctionCall.ParameterPackType; @@ -85,9 +86,9 @@ public final class EvalCompositeAccess implements ICPPEvaluation { } else if (type instanceof InitializerListType) { InitializerListType initListType = (InitializerListType) type; return initListType.getEvaluation().getClauses()[elementId].getType(point); - } else if (type instanceof ICompositeType) { - ICompositeType compositeType = (ICompositeType) type; - return compositeType.getFields()[elementId].getType(); + } else if (type instanceof ICPPClassType) { + ICPPClassType classType = (ICPPClassType) type; + return ClassTypeHelper.getFields(classType, point)[elementId].getType(); } else if (type instanceof ParameterPackType) { ParameterPackType parameterPackType = (ParameterPackType) type; return parameterPackType.getTypes()[elementId];