diff options
author | Nathan Ridge | 2016-12-04 22:38:27 +0000 |
---|---|---|
committer | Nathan Ridge | 2016-12-22 00:16:46 +0000 |
commit | 9b3a28f334b9c8ce452fc8ae83d2317bd39f2ced (patch) | |
tree | 1582933adcee51bd0fd476ef61d052751573da43 | |
parent | 2155b119ea5b4b0df7397c6eee87e4cffb6aaa4b (diff) | |
download | org.eclipse.cdt-9b3a28f334b9c8ce452fc8ae83d2317bd39f2ced.tar.gz org.eclipse.cdt-9b3a28f334b9c8ce452fc8ae83d2317bd39f2ced.tar.xz org.eclipse.cdt-9b3a28f334b9c8ce452fc8ae83d2317bd39f2ced.zip |
Bug 508254 - Fix some more indexer exceptions
- Avoid a ClassCastException in CPPConstructor.getMemberEvaluation()
- Fix an unsafe method call in EvalCompositeAccess.getType()
- Emit a log message in an error case in ASTInternal.getDefinitionOfBinding()
- Emit a log message in an error case in CompositeValue.setSubValue()
Change-Id: I5932c8b661e31eff32c2bb138efdb3029894d0ab
4 files changed, 24 insertions, 7 deletions
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]; |