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 6c28e18b783..bb429562e67 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 @@ -5385,4 +5385,21 @@ public class AST2TemplateTests extends AST2BaseTest { public void testTemplateIDAmbiguity_341747d() throws Exception { parseAndCheckBindings(); } + + // template void ft(void (T::* function)()) {} + // struct Bar { + // template Bar(void (T::*function)()) {} + // }; + // struct Foo { + // void function() {} + // void function(int) {} + // }; + // int test2() { + // Bar test(&Foo::function); // Invalid overload of 'Foo::func tion' + // ft(&Foo::function); + // return 0; + // } + public void testAddressOfMethodForInstantiation_Bug344310() throws Exception { + parseAndCheckBindings(); + } } 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 6c9947a11a4..905c81e39eb 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 @@ -2738,16 +2738,38 @@ public class CPPSemantics { } } else if (prop == ICPPASTConstructorInitializer.ARGUMENT) { ICPPASTConstructorInitializer init = (ICPPASTConstructorInitializer) parent; - if (init.getArguments().length == 1) { - final IASTNode parentOfInit = init.getParent(); - if (parentOfInit instanceof IASTDeclarator) { - IASTDeclarator dtor = (IASTDeclarator) parentOfInit; - targetType= CPPVisitor.createType(dtor); - } else if (parentOfInit instanceof ICPPASTConstructorChainInitializer) { - ICPPASTConstructorChainInitializer memInit= (ICPPASTConstructorChainInitializer) parentOfInit; - IBinding var= memInit.getMemberInitializerId().resolveBinding(); - if (var instanceof IVariable) { - targetType= ((IVariable) var).getType(); + final IASTNode parentOfInit = init.getParent(); + if (parentOfInit instanceof IASTDeclarator) { + IASTDeclarator dtor = (IASTDeclarator) parentOfInit; + targetType= CPPVisitor.createType(dtor); + } else if (parentOfInit instanceof ICPPASTConstructorChainInitializer) { + ICPPASTConstructorChainInitializer memInit= (ICPPASTConstructorChainInitializer) parentOfInit; + IBinding var= memInit.getMemberInitializerId().resolveBinding(); + if (var instanceof IVariable) { + targetType= ((IVariable) var).getType(); + } + } + targetType= getNestedType(targetType, TDEF | REF | CVTYPE | PTR | MPTR); + if (init.getArguments().length != 1 || !(targetType instanceof ICPPFunctionType)) { + if (targetType instanceof ICPPClassType) { + LookupData data= new LookupData(name); + data.setFunctionArguments(false, init.getArguments()); + try { + IBinding ctor = CPPSemantics.resolveFunction(data, ((ICPPClassType) targetType).getConstructors(), true); + if (ctor instanceof ICPPConstructor) { + int i= 0; + for (IASTNode arg : init.getArguments()) { + if (arg == node) { + IType[] params= ((ICPPConstructor) ctor).getType().getParameterTypes(); + if (params.length > i) { + targetType= params[i]; + } + break; + } + i++; + } + } + } catch (DOMException e) { } } } 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 b267c76ff27..021c2faaa83 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 @@ -38,6 +38,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameterPackType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; @@ -48,6 +49,7 @@ 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; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerToMemberType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPReferenceType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; @@ -311,6 +313,9 @@ public class TemplateArgumentDeduction { Set handled= new HashSet(); for (ICPPFunction f : fs) { arg= f.getType(); + if (f instanceof ICPPMethod && !f.isStatic()) { + arg= new CPPPointerToMemberType(arg, ((ICPPMethod) f).getClassOwner(), false, false, false); + } if (handled.add(ASTTypeUtil.getType(arg, true))) { final CPPTemplateParameterMap state = deduct.saveState(); if (deduceFromFunctionArg(par, arg, argCats.get(j), deduct)) {