From 1548dc7cf4e786a3e085d59333381daa94f38d6a Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 29 Jan 2016 18:53:39 -0800 Subject: [PATCH] Bug 486618 - Name resolution problem with alias template Change-Id: I0cf37128925fdf4a1a4fc334926efe4b81caee2f --- .../parser/tests/ast2/AST2TemplateTests.java | 22 ++++++++++++++++++- .../parser/cpp/semantics/CPPTemplates.java | 5 +++++ 2 files changed, 26 insertions(+), 1 deletion(-) 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 3f28823187d..c3f89c9e384 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 @@ -7226,7 +7226,27 @@ public class AST2TemplateTests extends AST2TestBase { public void testAliasTemplate_416280_2() throws Exception { parseAndCheckBindings(); } - + + // struct A { + // static constexpr bool val = true; + // }; + // + // struct C { + // template + // using AC = A; + // }; + // + // template + // struct D { + // template + // struct AD : T::template AC {}; + // }; + // + // bool b = D::template AD::val; + public void testAliasTemplate_486618() throws Exception { + parseAndCheckBindings(); + } + // template // struct Struct {}; // 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 6d434044bcd..add14215af3 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 @@ -2844,6 +2844,11 @@ public class CPPTemplates { if (unknown instanceof ICPPUnknownMemberClassInstance && result instanceof ICPPTemplateDefinition) { ICPPTemplateArgument[] args1 = instantiateArguments( ((ICPPUnknownMemberClassInstance) unknown).getArguments(), tpMap, packOffset, within, point, false); + if (result instanceof ICPPAliasTemplate) { + IType aliasedType = ((ICPPAliasTemplate) result).getType(); + if (aliasedType instanceof IBinding) + result = (IBinding) aliasedType; + } if (result instanceof ICPPClassTemplate) { result = instantiate((ICPPClassTemplate) result, args1, point); }