From 8ced7ce43bbbf2b69bc7ce38ee1d09ece2e94c93 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Mon, 6 Aug 2012 21:14:00 -0700 Subject: [PATCH] Bug 374993. Fixed AST2TemplateTests.testDependentExpressions_b. --- .../parser/tests/ast2/AST2TemplateTests.java | 2 +- .../parser/cpp/semantics/CPPEvaluation.java | 3 +++ .../parser/cpp/semantics/CPPTemplates.java | 7 ++++++ .../dom/parser/cpp/semantics/EvalBinding.java | 2 +- .../cpp/semantics/EvalFunctionCall.java | 6 +++-- .../core/dom/parser/cpp/semantics/EvalID.java | 22 ++++++++----------- 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 0cba0b7e158..afa8c76d131 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -5661,7 +5661,7 @@ public class AST2TemplateTests extends AST2BaseTest { // void test(B::pointer a) { // f(a); // } - public void _testDependentExpressions_b() throws Exception { + public void testDependentExpressions_b() throws Exception { parseAndCheckBindings(); BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), CPP); ICPPFunction func= bh.assertNonProblem("f(a)", 1, ICPPFunction.class); 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 45edc144710..beafb1b0979 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 @@ -215,6 +215,9 @@ public abstract class CPPEvaluation implements ICPPEvaluation { } } + CPPEvaluation() { + } + @Override public char[] getSignature() { SignatureBuilder buf = new SignatureBuilder(); 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 0f2f9a6ad9f..d1036eab0ea 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 @@ -1259,6 +1259,13 @@ public class CPPTemplates { return typeContainer; } + if (type instanceof TypeOfDependentExpression) { + ICPPEvaluation eval = ((TypeOfDependentExpression) type).getEvaluation(); + ICPPEvaluation instantiated = eval.instantiate(tpMap, packOffset, within, Value.MAX_RECURSION_DEPTH, point); + if (instantiated != eval) + return instantiated.getTypeOrFunctionSet(point); + } + return type; } catch (DOMException e) { return e.getProblem(); 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 acd6fc952c9..fbb50500da8 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 @@ -160,7 +160,7 @@ public class EvalBinding extends CPPEvaluation { final IFunctionType type = ((IFunction) fBinding).getType(); if (CPPTemplates.isDependentType(type)) return new TypeOfDependentExpression(this); - return SemanticUtil.mapToAST(type, point); + return SemanticUtil.mapToAST(type, point); } return ProblemType.UNKNOWN_FOR_EXPRESSION; } 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 6cb3db90499..db34d140b8d 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 @@ -40,6 +40,7 @@ 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; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.LookupMode; import org.eclipse.core.runtime.CoreException; @@ -201,6 +202,7 @@ public class EvalFunctionCall extends CPPEvaluation { return this; if (args[0] instanceof EvalFunctionSet) { + // Resolve the function using the parameters of the function call. CPPFunctionSet functionSet = ((EvalFunctionSet) args[0]).getFunctionSet(); ICPPFunction[] functions = functionSet.getBindings(); LookupData data = new LookupData(functions[0].getNameCharArray(), @@ -208,8 +210,8 @@ public class EvalFunctionCall extends CPPEvaluation { data.setFunctionArguments(false, Arrays.copyOfRange(args, 1, args.length)); try { IBinding binding = CPPSemantics.resolveFunction(data, functions, true); - if (binding instanceof ICPPFunction) - return new EvalBinding(binding, null); + if (binding instanceof ICPPFunction && !(binding instanceof ICPPUnknownBinding)) + args[0] = new EvalBinding(binding, null); } catch (DOMException e) { CCorePlugin.log(e); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java index 34d3d063c46..f5547474e44 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java @@ -44,7 +44,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; 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.ICPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; @@ -291,26 +290,23 @@ public class EvalID extends CPPEvaluation { } IBinding nameOwner = fNameOwner; - if (nameOwner instanceof ICPPTemplateParameter) { - ICPPTemplateArgument argument = tpMap.getArgument((ICPPTemplateParameter) nameOwner); - if (argument != null) { - IType type = argument.getTypeValue(); - if (type instanceof IBinding) - nameOwner = (IBinding) type; - } - } else if (nameOwner instanceof ICPPUnknownBinding) { - nameOwner = resolveUnknown((ICPPUnknownBinding) nameOwner, tpMap, packOffset, within, point); - } else if (nameOwner instanceof ICPPClassTemplate) { + if (nameOwner instanceof ICPPClassTemplate) { + // TODO(sprigogin): Figure out why testDependentExpressions_a fails without special-casing ICPPClassTemplate nameOwner = resolveUnknown(CPPTemplates.createDeferredInstance((ICPPClassTemplate) nameOwner), tpMap, packOffset, within, point); + } else if (nameOwner instanceof IType) { + IType type = CPPTemplates.instantiateType((IType) nameOwner, tpMap, packOffset, within, point); + if (type instanceof IBinding) + nameOwner = (IBinding) type; } + if (fieldOwner instanceof IProblemBinding || nameOwner instanceof IProblemBinding) return this; if (Arrays.equals(templateArgs, fTemplateArgs) && fieldOwner == fFieldOwner && nameOwner == fNameOwner) return this; - ICPPEvaluation eval = resolveName((ICPPClassType) nameOwner, fTemplateArgs, point); + ICPPEvaluation eval = resolveName((ICPPClassType) nameOwner, templateArgs, point); if (eval != null) return eval; @@ -329,7 +325,7 @@ public class EvalID extends CPPEvaluation { if (bindings.length > 1 && bindings[0] instanceof ICPPFunction) { ICPPFunction[] functions = new ICPPFunction[bindings.length]; System.arraycopy(bindings, 0, functions, 0, bindings.length); - return new EvalFunctionSet(new CPPFunctionSet(functions, fTemplateArgs, null), fAddressOf); + return new EvalFunctionSet(new CPPFunctionSet(functions, templateArgs, null), fAddressOf); } IBinding binding = bindings.length == 1 ? bindings[0] : null; if (binding instanceof IEnumerator) {