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];