bug 525288 - resolve partial template specializations in
CSourceHover/OpenDeclaration

Change-Id: I61c06fc453499ddc2b1af73a8a69d4b648d473c3
Signed-off-by: Michael Woski <woskimi@yahoo.de>
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java
index b5d48fc..ba3dc41 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java
@@ -512,7 +512,7 @@
 	 */
 	public static IBinding[] resolveUnknownBinding(ICPPUnknownBinding binding) {
 		if (binding instanceof ICPPDeferredClassInstance) {
-			return new IBinding[] { ((ICPPDeferredClassInstance) binding).getClassTemplate() };
+			return new IBinding[] { chooseTemplateForDeferredInstance((ICPPDeferredClassInstance) binding) };
 		} else if (binding instanceof ICPPUnknownMember) {
 			Set<HeuristicLookup> lookupSet = new HashSet<>();
 			return lookInside(((ICPPUnknownMember) binding).getOwnerType(), false,
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java
index e26473f..6425171 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java
@@ -45,6 +45,7 @@
 import org.eclipse.cdt.core.testplugin.FileManager;
 
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
 
 import org.eclipse.cdt.internal.ui.search.actions.OpenDeclarationsAction;
 
@@ -1353,15 +1354,41 @@
 	public void testDependentAutoType_520913() throws Exception {
 		String code = getAboveComment();
 		IFile file = importFile("testBug520913a.cpp", code);
-		
+
 		int offset = code.indexOf("auto test = ") + 2;
 		IASTNode target = testF3(file, offset);
 		assertInstance(target, IASTName.class);
 		assertEquals("AA", ((IASTName) target).toString());
-		
+
 		offset = code.indexOf("auto test()") + 2;
 		target = testF3(file, offset);
 		assertInstance(target, IASTName.class);
 		assertEquals("AA", ((IASTName) target).toString());
 	}
+
+	// template<char T>
+	// struct A {};
+	//
+	// template<>
+	// struct A<0> {};
+	//
+	// void test(){
+	//   A<0> a0;
+	//   A<1> a1;
+	// }
+	public void testPartialSpecializationResolution_525288() throws Exception {
+		CPPASTNameBase.sAllowNameComputation = true;
+		String code = getAboveComment();
+		IFile file = importFile("testBug525288.cpp", code);
+
+		int offset = code.indexOf("a0") - 5;
+		IASTNode target = testF3(file, offset);
+		assertInstance(target, IASTName.class);
+		assertEquals("A<0>", ((IASTName) target).toString());
+
+		offset = code.indexOf("a1") - 5;
+		target = testF3(file, offset);
+		assertInstance(target, IASTName.class);
+		assertEquals("A", ((IASTName) target).toString());
+	}
 }