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 2d9fc41e6aa..2e622a0cfc3 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 @@ -3770,4 +3770,18 @@ public class AST2TemplateTests extends AST2BaseTest { BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); bh.assertNonProblem("A make_A(C* p) {", 4, ICPPTemplateInstance.class); } + + // template class CT { + // public: + // template CT(U u) {} + // }; + // template void any(T t) {} + // void test() { + // int* iptr; + // any(CT(iptr)); + // } + public void testConstructorTemplateInClassTemplate() throws Exception { + String code= getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + } } 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 d62be368db4..ff38d362010 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 @@ -607,15 +607,6 @@ public class CPPTemplates { parentOfName= parentOfName.getParent(); } - IASTNode parentOfDeclaration= parentOfName; - while (parentOfDeclaration != null) { - if (parentOfDeclaration instanceof IASTDeclaration) { - parentOfDeclaration= parentOfDeclaration.getParent(); - break; - } - parentOfDeclaration= parentOfDeclaration.getParent(); - } - return parentOfName instanceof ICPPASTElaboratedTypeSpecifier || parentOfName instanceof ICPPASTCompositeTypeSpecifier || parentOfName instanceof ICPPASTNamedTypeSpecifier || @@ -1368,7 +1359,11 @@ public class CPPTemplates { ICPPFunctionTemplate template = (ICPPFunctionTemplate) templates.keyAt(idx); CPPTemplateParameterMap map= new CPPTemplateParameterMap(fnArgs.length); try { - ICPPTemplateArgument[] args= deduceTemplateFunctionArguments(template, templateArguments, fnArgs, map); + ICPPTemplateArgument[] useArgs = templateArguments; + if (template instanceof ICPPConstructor) + useArgs= ICPPTemplateArgument.EMPTY_ARGUMENTS; + + ICPPTemplateArgument[] args= deduceTemplateFunctionArguments(template, useArgs, fnArgs, map); if (args != null) { IBinding temp= instantiateFunctionTemplate(template, args); if (temp instanceof IFunction) {