From 395490c7ae3cab43fe82a3946ac1e0fc83e1367c Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 17 Apr 2009 06:17:01 +0000 Subject: [PATCH] Fix for bug 271948. --- .../core/parser/tests/ast2/AST2TemplateTests.java | 12 ++++++------ .../core/dom/parser/cpp/CPPUnknownFunction.java | 3 +-- .../core/dom/parser/cpp/semantics/CPPSemantics.java | 6 +++--- .../core/dom/parser/cpp/semantics/CPPTemplates.java | 10 +++++++--- .../core/dom/parser/cpp/semantics/Conversions.java | 5 +++-- 5 files changed, 20 insertions(+), 16 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 140c08fd30a..792279e226b 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 @@ -3994,11 +3994,11 @@ public class AST2TemplateTests extends AST2BaseTest { // void test(B p) { // f(p); // } - public void _testTemplateConversionOperator_271948_1() throws Exception { + public void testTemplateConversionOperator_271948_1() throws Exception { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } - + // template // struct A { // }; @@ -4009,12 +4009,12 @@ public class AST2TemplateTests extends AST2BaseTest { // operator A(); // }; // - // void f(A p); + // void f(const A& p); // - // void test(B p) { - // f(p); + // void test(B x) { + // f(x); // } - public void _testTemplateConversionOperator_271948_2() throws Exception { + public void testTemplateConversionOperator_271948_2() throws Exception { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java index 3f2d302c198..be34a8bff14 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java @@ -11,7 +11,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IParameter; @@ -27,7 +26,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; */ public class CPPUnknownFunction extends CPPUnknownBinding implements ICPPFunction { - public static IFunction createForSample(IFunction sample, IASTName name) throws DOMException { + public static IFunction createForSample(IFunction sample) throws DOMException { if (sample instanceof ICPPConstructor) return new CPPUnknownConstructor(((ICPPConstructor) sample).getClassOwner()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 050af5a2d32..c92c3867299 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -2112,7 +2112,7 @@ public class CPPSemantics { if (CPPTemplates.containsDependentType(argTypes)) { if (viableCount == 1) return firstViable; - return CPPUnknownFunction.createForSample(firstViable, data.astName); + return CPPUnknownFunction.createForSample(firstViable); } boolean ambiguous = false; // ambiguity, 2 functions are equally good @@ -2131,7 +2131,7 @@ public class CPPSemantics { if (fnCost == CONTAINS_DEPENDENT_TYPES) { if (viableCount == 1) return firstViable; - return CPPUnknownFunction.createForSample(firstViable, data.astName); + return CPPUnknownFunction.createForSample(firstViable); } if (fnCost.hasDeferredUDC()) { @@ -2272,7 +2272,7 @@ public class CPPSemantics { return new ProblemBinding(astName, IProblemBinding.SEMANTIC_INVALID_TYPE); } if (!data.forFunctionDeclaration() || data.forExplicitFunctionSpecialization()) { - CPPTemplates.instantiateConversionTemplates(fns, t, data.astName); + CPPTemplates.instantiateConversionTemplates(fns, t); } IFunction unknown= null; 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 ef1481c6472..1ef56db8acc 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 @@ -1361,13 +1361,13 @@ public class CPPTemplates { templateArguments = ICPPTemplateArgument.EMPTY_ARGUMENTS; try { if (containsDependentType(fnArgs)) { - functions[i]= CPPUnknownFunction.createForSample(template, name); + functions[i]= CPPUnknownFunction.createForSample(template); return; } if (name instanceof ICPPASTTemplateId && !(template instanceof ICPPConstructor)) { templateArguments = createTemplateArgumentArray((ICPPASTTemplateId) name); if (hasDependentArgument(templateArguments)) { - functions[i]= CPPUnknownFunction.createForSample(template, name); + functions[i]= CPPUnknownFunction.createForSample(template); return; } } @@ -1396,6 +1396,10 @@ public class CPPTemplates { } static protected void instantiateConversionTemplates(IFunction[] functions, IType conversionType, IASTName name) { + instantiateConversionTemplates(functions, conversionType); + } + + static protected void instantiateConversionTemplates(IFunction[] functions, IType conversionType) { boolean checkedForDependentType= false; for (int i = 0; i < functions.length; i++) { IFunction func = functions[i]; @@ -1407,7 +1411,7 @@ public class CPPTemplates { if (!checkedForDependentType) { try { if (isDependentType(conversionType)) { - functions[i]= CPPUnknownFunction.createForSample(template, name); + functions[i]= CPPUnknownFunction.createForSample(template); return; } checkedForDependentType= true; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java index 076a5542bf8..b0dce3442bf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java @@ -369,8 +369,9 @@ public class Conversions { boolean ambiguousConversionOperator= false; if (s instanceof ICPPClassType) { ICPPMethod[] ops = SemanticUtil.getConversionOperators((ICPPClassType) s); - if (ops.length > 0 && !(ops[0] instanceof IProblemBinding)) { - for (final ICPPMethod op : ops) { + CPPTemplates.instantiateConversionTemplates(ops, target); + for (final ICPPMethod op : ops) { + if (op != null && !(op instanceof IProblemBinding)) { Cost cost= checkStandardConversionSequence(op.getType().getReturnType(), target, false); if (cost.getRank() != Rank.NO_MATCH) { int cmp= cost.compareTo(operatorCost);