From 22078c723dc15fe30a8111b0c833cee1422e5bc9 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Wed, 4 Sep 2013 14:39:47 -0700 Subject: [PATCH] Bug 416280 - Name resolution problem with alias template. --- .../parser/tests/ast2/AST2TemplateTests.java | 16 ++++++++++++++++ .../cpp/semantics/TemplateArgumentDeduction.java | 5 +++++ 2 files changed, 21 insertions(+) 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 fd7bcba9dd2..d0823a45939 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 @@ -7082,6 +7082,22 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // struct A {}; + // + // template + // using B = A; + // + // template + // void f(B* p); + // + // void test(A* c) { + // f(c); + // } + public void testAliasTemplate_416280() throws Exception { + parseAndCheckBindings(); + } + // template // struct A { // typedef U type1; 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 fa1f084246c..6e1104260a8 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 @@ -292,6 +292,9 @@ public class TemplateArgumentDeduction { } } } + while (pcheck instanceof ITypedef) + pcheck = ((ITypedef) pcheck).getType(); + if (pcheck instanceof ICPPTemplateInstance && argcheck instanceof ICPPClassType) { ICPPTemplateInstance pInst = (ICPPTemplateInstance) pcheck; ICPPClassTemplate pTemplate= getPrimaryTemplate(pInst); @@ -830,6 +833,8 @@ public class TemplateArgumentDeduction { IType argumentTypeBeforeTypedefResolution = a; while (a instanceof ITypedef) a = ((ITypedef) a).getType(); + while (p instanceof ITypedef) + p = ((ITypedef) p).getType(); if (p instanceof IBasicType) { return p.isSameType(a); } else if (p instanceof ICPPPointerToMemberType) {