From 7372454012f7ce08feb97d1391e3c698b6120d47 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 23 Dec 2010 15:17:18 +0000 Subject: [PATCH] Bug 332884: Partial specializations of class template specializations. --- .../tests/IndexCPPTemplateResolutionTest.java | 38 +++++++++++++++++++ .../eclipse/cdt/internal/core/pdom/PDOM.java | 7 ++-- ...tePartialSpecializationSpecialization.java | 1 - .../PDOMCPPClassTemplateSpecialization.java | 36 ++++-------------- 4 files changed, 49 insertions(+), 33 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 4e2157f4972..41296c1fbe4 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 @@ -1795,4 +1795,42 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa assertTrue(reference instanceof ICPPSpecialization); } + // template class enclosing { + // template + // struct sort_out_types_impl; + // template struct sort_out_types_impl { + // typedef P1 matching_type; + // }; + // template struct sort_out_types_impl { + // typedef P2 matching_type; + // }; + // }; + + // template class Predicate> + // struct sort_out_types { + // static const bool P1_matches = Predicate::value; + // static const bool P2_matches = Predicate::value; + // typedef typename enclosing<>::sort_out_types_impl::matching_type matching_type; + // }; + // template struct type_predicate { + // static const bool value = false; + // }; + // template <> struct type_predicate { + // static const bool value = true; + // }; + // template struct A { + // typedef typename sort_out_types::matching_type arg_type; + // void f(arg_type); + // }; + // int main() { + // A a; + // a.f(0); + // return 0; + // } + public void testPartialSpecializationsOfClassTemplateSpecializations_332884() throws Exception { + final IBinding reference = getBindingFromASTName("f(0)", 1); + assertTrue(reference instanceof ICPPSpecialization); + } + + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 262b0b06593..82d70397b35 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -202,10 +202,11 @@ public class PDOM extends PlatformObject implements IPDOM { * 111.1 - defaulted and deleted functions, bug 305978 * 112.0 - inline namespaces, bug 305980 * 113.0 - Changed marshaling of values, bug 327878 + * 114.0 - Partial specializations for class template specializations, bug 332884. */ - private static final int MIN_SUPPORTED_VERSION= version(113, 0); - private static final int MAX_SUPPORTED_VERSION= version(113, Short.MAX_VALUE); - private static final int DEFAULT_VERSION = version(113, 0); + private static final int MIN_SUPPORTED_VERSION= version(114, 0); + private static final int MAX_SUPPORTED_VERSION= version(114, Short.MAX_VALUE); + private static final int DEFAULT_VERSION = version(114, 0); private static int version(int major, int minor) { return (major << 16) + minor; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java index 95b6545c061..44f90f43570 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java @@ -47,7 +47,6 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla super(linkage, parent, partial, specialized); getDB().putRecPtr(record + PRIMARY_TEMPLATE, primary.getRecord()); - primary.addPartial(this); linkage.new ConfigurePartialSpecialization(this, partial); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java index da551c09498..1c4585e2a63 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java @@ -11,9 +11,6 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; -import java.util.ArrayList; - -import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding; @@ -45,9 +42,8 @@ import org.eclipse.core.runtime.CoreException; class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization implements ICPPClassTemplate, ICPPInstanceCache { - private static final int FIRST_PARTIAL = PDOMCPPClassSpecialization.RECORD_SIZE; @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPClassSpecialization.RECORD_SIZE+4; + protected static final int RECORD_SIZE = PDOMCPPClassSpecialization.RECORD_SIZE; public PDOMCPPClassTemplateSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPClassTemplate template, PDOMBinding specialized) throws CoreException { @@ -161,32 +157,14 @@ class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization } } - private PDOMCPPClassTemplatePartialSpecializationSpecialization getFirstPartial() throws CoreException { - long value = getDB().getRecPtr(record + FIRST_PARTIAL); - return value != 0 ? new PDOMCPPClassTemplatePartialSpecializationSpecialization(getLinkage(), value) : null; - } - - public void addPartial(PDOMCPPClassTemplatePartialSpecializationSpecialization pspecspec) throws CoreException { - PDOMCPPClassTemplatePartialSpecializationSpecialization first = getFirstPartial(); - pspecspec.setNextPartial(first); - getDB().putRecPtr(record + FIRST_PARTIAL, pspecspec.getRecord()); - } - public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { - try { - ArrayList partials = - new ArrayList(); - for (PDOMCPPClassTemplatePartialSpecializationSpecialization partial = getFirstPartial(); - partial != null; - partial = partial.getNextPartial()) { - partials.add(partial); - } - - return partials.toArray(new PDOMCPPClassTemplatePartialSpecializationSpecialization[partials.size()]); - } catch (CoreException e) { - CCorePlugin.log(e); - return new PDOMCPPClassTemplatePartialSpecializationSpecialization[0]; + ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding(); + ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations(); + ICPPClassTemplatePartialSpecialization[] spec = new ICPPClassTemplatePartialSpecialization[orig.length]; + for (int i = 0; i < orig.length; i++) { + spec[i]= (ICPPClassTemplatePartialSpecialization) specializeMember(orig[i]); } + return spec; } public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {