diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java
index 30b68f9d52e..1b693dab40d 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java
@@ -65,11 +65,10 @@ public class BinaryRunner {
ICElement root = factory.getCModel();
CElementDelta cdelta = new CElementDelta(root);
cdelta.changed(cproj, ICElementDelta.F_CONTENT);
- for (int j = 0; j < containers.length; ++j) {
+ for (IParent container : containers) {
if (fMonitor.isCanceled()) {
return;
}
- IParent container = containers[j];
ICElement[] children = container.getChildren();
if (children.length > 0) {
cdelta.added((ICElement)container);
@@ -171,9 +170,9 @@ public class BinaryRunner {
}
private class Visitor implements IResourceProxyVisitor {
- private IProgressMonitor vMonitor;
- private IProject project;
- private IContentType textContentType;
+ private final IProgressMonitor vMonitor;
+ private final IProject project;
+ private final IContentType textContentType;
public Visitor(IProgressMonitor monitor) {
vMonitor = monitor;
@@ -200,7 +199,7 @@ public class BinaryRunner {
// check against known content types
// if the file has an extension
String name = proxy.getName();
- if (name.contains(".")) {
+ if (name.contains(".")) { //$NON-NLS-1$
IContentType contentType = CCorePlugin.getContentType(project, name);
if (contentType != null && textContentType != null) {
if (contentType.isKindOf(textContentType)) {
@@ -217,8 +216,8 @@ public class BinaryRunner {
// we have a candidate
IPath path = proxy.requestFullPath();
if (path != null) {
- for (int i = 0; i < entries.length; ++i) {
- if (isOnOutputEntry(entries[i], path)) {
+ for (IOutputEntry entrie : entries) {
+ if (isOnOutputEntry(entrie, path)) {
IFile file = (IFile) proxy.requestResource();
CModelManager factory = CModelManager.getDefault();
IBinaryFile bin = factory.createBinaryFile(file);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java
index a4aa4fb9c77..98f32777a92 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java
@@ -12,6 +12,7 @@ package org.eclipse.cdt.core.dom.ast.cpp;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
/**
* Models the value of a template parameter or for the argument of a template-id.
@@ -42,6 +43,14 @@ public interface ICPPTemplateArgument {
*/
IType getTypeValue();
+ /**
+ * If this is a non-type value (suitable for a template non-type parameters),
+ * the evaluation object is returned.
+ * For type values, null
is returned.
+ * @noreference This method is not intended to be referenced by clients.
+ */
+ ICPPEvaluation getNonTypeEvaluation();
+
/**
* If this is a non-type value (suitable for a template non-type parameters),
* the value is returned.
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java
index da4a20f4cdb..8fb39d3c2e7 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java
@@ -370,7 +370,7 @@ public class Value implements IValue {
* Tests whether the value depends on a template parameter.
*/
public static boolean isDependentValue(IValue nonTypeValue) {
- return nonTypeValue.getEvaluation() != null;
+ return nonTypeValue != null && nonTypeValue.getEvaluation() != null;
}
/**
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java
index 60e3b2a1a4c..e99fbcd791a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java
@@ -35,7 +35,6 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArraySet;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
-import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
/**
* For example in the constructor definition
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java
index 3c095d5db00..fdc43248ec6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java
@@ -51,6 +51,11 @@ public class CPPTemplateNonTypeArgument implements ICPPTemplateArgument {
return null;
}
+ @Override
+ public ICPPEvaluation getNonTypeEvaluation() {
+ return fEvaluation;
+ }
+
@Override
public IValue getNonTypeValue() {
return fEvaluation.getValue(null);
@@ -94,8 +99,4 @@ public class CPPTemplateNonTypeArgument implements ICPPTemplateArgument {
public String toString() {
return getNonTypeValue().toString();
}
-
- public ICPPEvaluation getEvaluation() {
- return fEvaluation;
- }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java
index 7ec0f62f798..c8c7bc02aca 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java
@@ -43,6 +43,11 @@ public class CPPTemplateTypeArgument implements ICPPTemplateArgument {
return fType;
}
+ @Override
+ public ICPPEvaluation getNonTypeEvaluation() {
+ return null;
+ }
+
@Override
public IValue getNonTypeValue() {
return null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java
index 8c2d30ed54c..9c87b033846 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java
@@ -27,7 +27,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableType;
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
import org.eclipse.cdt.internal.core.dom.parser.Value;
-import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateNonTypeArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.core.runtime.CoreException;
@@ -112,9 +111,9 @@ public abstract class CPPEvaluation implements ICPPEvaluation {
@Override
public void marshalTemplateArgument(ICPPTemplateArgument arg) throws CoreException {
- if (arg instanceof CPPTemplateNonTypeArgument) {
+ if (arg.isNonTypeValue()) {
putByte(VALUE);
- ((CPPTemplateNonTypeArgument) arg).getEvaluation().marshal(this, true);
+ arg.getNonTypeEvaluation().marshal(this, true);
} else {
marshalType(arg.getTypeValue());
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java
index 122590d4731..662330216c1 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java
@@ -29,7 +29,6 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
-import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
@@ -44,6 +43,7 @@ import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
+import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IQualifierType;
import org.eclipse.cdt.core.dom.ast.IScope;
@@ -56,6 +56,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBas
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
@@ -1074,13 +1075,11 @@ public class CPPTemplates {
if (arg == null)
return null;
if (arg.isNonTypeValue()) {
- final IValue origValue= arg.getNonTypeValue();
- final IType origType= arg.getTypeOfNonTypeValue();
- final IValue instValue= instantiateValue(origValue, tpMap, packOffset, within, Value.MAX_RECURSION_DEPTH, point);
- final IType instType= instantiateType(origType, tpMap, packOffset, within, point);
- if (origType == instType && origValue == instValue)
+ final ICPPEvaluation eval = arg.getNonTypeEvaluation();
+ final ICPPEvaluation newEval= eval.instantiate(tpMap, packOffset, within, Value.MAX_RECURSION_DEPTH, point);
+ if (eval == newEval)
return arg;
- return new CPPTemplateNonTypeArgument(instValue, instType);
+ return new CPPTemplateNonTypeArgument(newEval);
}
final IType orig= arg.getTypeValue();
@@ -1676,11 +1675,9 @@ public class CPPTemplates {
IASTNode arg= args[i];
if (arg instanceof IASTTypeId) {
result[i]= new CPPTemplateTypeArgument(CPPVisitor.createType((IASTTypeId) arg));
- } else if (arg instanceof IASTExpression) {
- IASTExpression expr= (IASTExpression) arg;
- IType type= expr.getExpressionType();
- IValue value= Value.create((IASTExpression) arg, Value.MAX_RECURSION_DEPTH);
- result[i]= new CPPTemplateNonTypeArgument(value, type);
+ } else if (arg instanceof ICPPASTExpression) {
+ ICPPASTExpression expr= (ICPPASTExpression) arg;
+ result[i]= new CPPTemplateNonTypeArgument(expr.getEvaluation());
} else {
throw new IllegalArgumentException("Unexpected type: " + arg.getClass().getName()); //$NON-NLS-1$
}
@@ -2190,11 +2187,11 @@ public class CPPTemplates {
if (map != null && pType != null) {
pType= instantiateType(pType, map, -1, null, point);
}
- if (argType instanceof ICPPUnknownType || argType instanceof ISemanticProblem || isNonTypeArgumentConvertible(pType, argType, point)) {
+
+ if (argType instanceof ICPPUnknownType) {
return new CPPTemplateNonTypeArgument(arg.getNonTypeValue(), pType);
}
- return null;
-
+ return convertNonTypeTemplateArgument(pType, arg, point);
} catch (DOMException e) {
return null;
}
@@ -2257,22 +2254,45 @@ public class CPPTemplates {
}
/**
- * Returns whether the template argument arg
can be converted to
- * the same type as paramType
using the rules specified in 14.3.2.5.
- * @param paramType
- * @param arg
- * @return
+ * Converts the template argument arg
to match the parameter type
+ * paramType
or returns null
, if this violates the rules
+ * specified in 14.3.2 - 5.
* @throws DOMException
*/
- private static boolean isNonTypeArgumentConvertible(IType paramType, IType arg, IASTNode point) throws DOMException {
+ private static ICPPTemplateArgument convertNonTypeTemplateArgument(final IType paramType, ICPPTemplateArgument arg, IASTNode point) throws DOMException {
//14.1s8 function to pointer and array to pointer conversions
+ IType a= arg.getTypeOfNonTypeValue();
+ IType p;
if (paramType instanceof IFunctionType) {
- paramType = new CPPPointerType(paramType);
+ p = new CPPPointerType(paramType);
} else if (paramType instanceof IArrayType) {
- paramType = new CPPPointerType(((IArrayType) paramType).getType());
+ p = new CPPPointerType(((IArrayType) paramType).getType());
+ } else {
+ p= paramType;
+ if (p.isSameType(a))
+ return arg;
}
- Cost cost = Conversions.checkImplicitConversionSequence(paramType, arg, LVALUE, UDCMode.FORBIDDEN, Context.ORDINARY, point);
- return cost != null && cost.converts();
+
+ if (a instanceof FunctionSetType) {
+ if (p instanceof IPointerType) {
+ p= ((IPointerType) p).getType();
+ }
+ if (p instanceof IFunctionType) {
+ final CPPFunctionSet functionSet = ((FunctionSetType) a).getFunctionSet();
+ for (ICPPFunction f : functionSet.getBindings()) {
+ if (p.isSameType(f.getType())) {
+ functionSet.applySelectedFunction(f);
+ return new CPPTemplateNonTypeArgument(new EvalBinding(f, null));
+ }
+ }
+ }
+ return null;
+ }
+ Cost cost = Conversions.checkImplicitConversionSequence(p, a, LVALUE, UDCMode.FORBIDDEN, Context.ORDINARY, point);
+ if (cost == null || !cost.converts())
+ return null;
+
+ return new CPPTemplateNonTypeArgument(arg.getNonTypeValue(), paramType);
}
static boolean argsAreTrivial(ICPPTemplateParameter[] pars, ICPPTemplateArgument[] args) {
@@ -2320,7 +2340,7 @@ public class CPPTemplates {
if (arg.isTypeValue())
return isDependentType(arg.getTypeValue());
- return Value.isDependentValue(arg.getNonTypeValue());
+ return arg.getNonTypeEvaluation().isValueDependent();
}
public static boolean containsDependentType(List ts) {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java
index fbb50500da8..dbd8c1296a8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java
@@ -223,9 +223,8 @@ public class EvalBinding extends CPPEvaluation {
return new EvalFixed(type, ValueCategory.PRVALUE, value);
} else if (fBinding instanceof ICPPTemplateNonTypeParameter) {
ICPPTemplateArgument argument = tpMap.getArgument((ICPPTemplateNonTypeParameter) fBinding);
- if (argument != null) {
- IValue value = argument.getNonTypeValue();
- return new EvalFixed(null, ValueCategory.PRVALUE, value);
+ if (argument != null && argument.isNonTypeValue()) {
+ return argument.getNonTypeEvaluation();
}
// TODO(sprigogin): Do we need something similar for pack expansion?
} else if (fBinding instanceof ICPPUnknownBinding) {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java
index 97632357044..6b287f62b1f 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java
@@ -238,6 +238,9 @@ public class EvalUnary extends CPPEvaluation {
}
IValue val = fArgument.getValue(point);
+ if (val == null)
+ return Value.UNKNOWN;
+
Long num = val.numericalValue();
if (num != null) {
return Value.evaluateUnaryExpression(fOperator, num);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java
index 3d9dadf4b01..9de29a630bb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java
@@ -437,6 +437,9 @@ public class SemanticUtil {
}
public static IType mapToAST(IType type, IASTNode node) {
+ if (node == null)
+ return type;
+
if (type instanceof IFunctionType) {
final ICPPFunctionType ft = (ICPPFunctionType) type;
final IType r = ft.getReturnType();
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java
index 14d895b84ae..e921895e1fb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java
@@ -54,6 +54,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.Value;
@@ -185,6 +186,20 @@ public class TemplateArgumentDeduction {
if (!map.addDeducedArgs(deduct.fDeducedArgs))
return false;
+ // 14.8.2.5 - 17
+ for (ICPPTemplateParameter tpar : tmplPars) {
+ if (tpar instanceof ICPPTemplateNonTypeParameter) {
+ ICPPTemplateArgument arg = deduct.fDeducedArgs.getArgument(tpar);
+ if (arg != null) {
+ IType type1 = ((ICPPTemplateNonTypeParameter) tpar).getType();
+ type1= CPPTemplates.instantiateType(type1, map, -1, null, point);
+ IType type2= arg.getTypeOfNonTypeValue();
+ if (!type1.isSameType(type2))
+ return false;
+ }
+ }
+ }
+
return verifyDeduction(tmplPars, map, true, point);
} catch (DOMException e) {
}
@@ -649,8 +664,6 @@ public class TemplateArgumentDeduction {
if (Value.referencesTemplateParameter(tval)) {
int parId= Value.isTemplateParameter(tval);
if (parId >= 0) {
- if (!p.getTypeOfNonTypeValue().isSameType(a.getTypeOfNonTypeValue()))
- return false;
ICPPTemplateArgument old= fDeducedArgs.getArgument(parId, fPackOffset);
if (old == null) {
return deduce(parId, a);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java
index 06cc8f1fc69..caae733da88 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java
@@ -93,14 +93,16 @@ public class TemplateInstanceUtil {
}
static ICPPTemplateArgument convert(ICompositesFactory cf, ICPPTemplateArgument arg) throws DOMException {
- if (arg instanceof CPPTemplateTypeArgument) {
+ if (arg == null)
+ return null;
+ if (arg.isTypeValue()) {
final IType typeValue = arg.getTypeValue();
IType t= cf.getCompositeType(typeValue);
if (t != typeValue) {
return new CPPTemplateTypeArgument(t);
}
- } else if (arg instanceof CPPTemplateNonTypeArgument) {
- ICPPEvaluation eval = ((CPPTemplateNonTypeArgument) arg).getEvaluation();
+ } else {
+ ICPPEvaluation eval = arg.getNonTypeEvaluation();
ICPPEvaluation eval2 = ((CPPCompositesFactory) cf).getCompositeEvaluation(eval);
if (eval2 != eval) {
return new CPPTemplateNonTypeArgument(eval2);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java
index b3e7656fca4..4abb48cee0c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java
@@ -189,9 +189,9 @@ public class TypeMarshalBuffer implements ITypeMarshalBuffer {
@Override
public void marshalTemplateArgument(ICPPTemplateArgument arg) throws CoreException {
- if (arg instanceof CPPTemplateNonTypeArgument) {
+ if (arg.isNonTypeValue()) {
putByte(VALUE);
- ((CPPTemplateNonTypeArgument) arg).getEvaluation().marshal(this, true);
+ arg.getNonTypeEvaluation().marshal(this, true);
} else {
marshalType(arg.getTypeValue());
}