mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-06 09:16:02 +02:00
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
This commit is contained in:
parent
2155b119ea
commit
9b3a28f334
4 changed files with 24 additions and 7 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Add table
Reference in a new issue