From 48d5341bf7fdfd5b11540e032ed2dc969e8c32d1 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 12 Dec 2013 21:49:33 -0500 Subject: [PATCH] Bug 401820 - Explicit specialization of template declared in header Change-Id: Ibf2156f880d42e87b1d954772b0faae384f9784b Signed-off-by: Nathan Ridge Reviewed-on: https://git.eclipse.org/r/19742 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../tests/IndexCPPTemplateResolutionTest.java | 20 +++++++++++++++++++ .../dom/parser/cpp/CPPTemplateDefinition.java | 7 +++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 86b1aafa0a9..304299688ec 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -2383,4 +2383,24 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa public void testAmbiguousBaseClassLookup_413406() throws Exception { getProblemFromASTName("eof();", 3); } + + // template + // struct S; + + // #include "header.h" + // template <> + // struct S { + // typedef int type; + // }; + // + // template + // struct S { + // typedef char type; + // }; + // + // typedef S<>::type T; + public void testExplicitSpecializationOfTemplateDeclaredInHeader_401820() throws Exception { + IType T = getBindingFromASTName("T", 1); + assertEquals("int", ASTTypeUtil.getType(T)); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java index 79f92c900bf..9aea40da2e9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java @@ -114,8 +114,11 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC final ICPPClassTemplate ib = getIndexBinding(); if (ib instanceof ICPPInstanceCache) { ICPPTemplateInstance cand= ((ICPPInstanceCache) ib).getInstance(arguments); - if (cand instanceof IIndexBinding && - getTemplateName().getTranslationUnit().getIndexFileSet().containsDeclaration((IIndexBinding) cand)) { + if (cand instanceof IIndexBinding) { + if (getTemplateName().getTranslationUnit().getIndexFileSet().containsDeclaration((IIndexBinding) cand)) { + return cand; + } + } else { return cand; } }