diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java index 5d080ebd114..74ac51e9f84 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java @@ -12,7 +12,6 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.typeFromReturnType; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.valueCategoryFromFunctionCall; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.valueCategoryFromReturnType; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE; @@ -34,7 +33,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; 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.ProblemType; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunction; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; @@ -124,24 +122,13 @@ public class EvalFunctionCall extends CPPDependentEvaluation { ICPPFunction overload = getOverload(point); if (overload != null) return ExpressionTypes.typeFromFunctionCall(overload); - - final ICPPEvaluation arg0 = fArguments[0]; - IType t= SemanticUtil.getNestedType(arg0.getType(point), TDEF | REF | CVTYPE); - if (t instanceof ICPPClassType) { - return ProblemType.UNKNOWN_FOR_EXPRESSION; + + ICPPEvaluation function = fArguments[0]; + IType result = ExpressionTypes.typeFromFunctionCall(function.getType(point)); + if (function instanceof EvalMemberAccess) { + result = ExpressionTypes.restoreTypedefs(result, ((EvalMemberAccess) function).getOwnerType()); } - - if (t instanceof IPointerType) { - t= SemanticUtil.getNestedType(((IPointerType) t).getType(), TDEF | REF | CVTYPE); - } - if (t instanceof IFunctionType) { - t = typeFromReturnType(((IFunctionType) t).getReturnType()); - if (arg0 instanceof EvalMemberAccess) { - t= ExpressionTypes.restoreTypedefs(t, ((EvalMemberAccess) arg0).getOwnerType()); - } - return t; - } - return ProblemType.UNKNOWN_FOR_EXPRESSION; + return result; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExpressionTypes.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExpressionTypes.java index e6e2bb16d2a..ab2a9070230 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExpressionTypes.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExpressionTypes.java @@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICQualifierType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; +import org.eclipse.cdt.internal.core.dom.parser.ProblemType; import org.eclipse.cdt.internal.core.dom.parser.c.CQualifierType; /** @@ -61,6 +62,18 @@ public class ExpressionTypes { } return ValueCategory.PRVALUE; } + + public static IType typeFromFunctionCall(IType functionType) { + IType t= SemanticUtil.getNestedType(functionType, TDEF | REF | CVTYPE); + if (t instanceof IPointerType) { + t= SemanticUtil.getNestedType(((IPointerType) t).getType(), TDEF | REF | CVTYPE); + } + if (t instanceof IFunctionType) { + t = typeFromReturnType(((IFunctionType) t).getReturnType()); + return t; + } + return ProblemType.UNKNOWN_FOR_EXPRESSION; + } public static IType typeFromFunctionCall(ICPPFunction function) { final ICPPFunctionType ft = function.getType(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java index b9e7f1b082f..261b537848d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java @@ -154,6 +154,14 @@ public class HeuristicResolver { return typeForBinding(candidates[0]); } } + } else if (evaluation instanceof EvalFunctionCall) { + EvalFunctionCall evalFunctionCall = (EvalFunctionCall) evaluation; + ICPPEvaluation function = evalFunctionCall.getArguments()[0]; + IType functionType = function.getType(point); + if (functionType instanceof ICPPUnknownType) { + functionType = resolveUnknownType((ICPPUnknownType) functionType, point); + } + return ExpressionTypes.typeFromFunctionCall(functionType); } // TODO(nathanridge): Handle more cases. } else if (type instanceof ICPPUnknownMemberClass) {