From 4d758c0fc95fd77658ffe621be6532b8cf9cbd9f Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 4 Jul 2011 10:48:01 +0200 Subject: [PATCH] Bug 350345: Typedef as class name for ctor with overloaded function pointer argument. --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 16 ++++++++++++++++ .../dom/parser/cpp/semantics/CPPSemantics.java | 12 ++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 092e1498ab9..0d8864a62e1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -9424,4 +9424,20 @@ public class AST2CPPTests extends AST2BaseTest { assertTrue(ctor instanceof ICPPConstructor); assertEquals(1, ((ICPPConstructor) ctor).getType().getParameterTypes().length); } + + // struct Foo { + // void Method(int) {} + // void Method() const {} + // }; + // template struct Callback { + // Callback(void (Foo::*function)(Arg arg)) { + // } + // }; + // typedef Callback MyCallback; + // void xx() { + // MyCallback x= MyCallback(&Foo::Method); // Invalid overload of 'Foo::Method' + // } + public void testTypedefAsClassNameWithFunctionPtrArgument_350345() 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 13d54fed2dc..c27ca9e4af7 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 @@ -362,13 +362,13 @@ public class CPPSemantics { } } - if (binding instanceof ICPPClassType) { - if (convertClassToConstructor(data.astName)) { - if (binding instanceof IIndexBinding) { - binding= data.tu.mapToAST((ICPPClassType) binding); + if (binding instanceof IType) { + IType t = getNestedType((IType) binding, TDEF); + if (t instanceof ICPPClassType && convertClassToConstructor(data.astName)) { + ICPPClassType cls= (ICPPClassType) t; + if (cls instanceof IIndexBinding) { + cls= data.tu.mapToAST(cls); } - ICPPClassType cls= (ICPPClassType) binding; - try { if (data.astName instanceof ICPPASTTemplateId && cls instanceof ICPPClassTemplate) { if (data.tu != null) {