Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2016-12-04 22:38:27 +0000
committerNathan Ridge2016-12-22 00:16:46 +0000
commit9b3a28f334b9c8ce452fc8ae83d2317bd39f2ced (patch)
tree1582933adcee51bd0fd476ef61d052751573da43
parent2155b119ea5b4b0df7397c6eee87e4cffb6aaa4b (diff)
downloadorg.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
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java3
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java10
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructor.java9
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java9
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];

Back to the top