mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-08 16:55:38 +02:00
speciializing nested templates with partial specializations
This commit is contained in:
parent
f8927a9f4c
commit
14aa4c430a
3 changed files with 55 additions and 58 deletions
|
@ -609,35 +609,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
buffer.append("template<int I> void f(X<I, I, int>); // #B\n"); //$NON-NLS-1$
|
buffer.append("template<int I> void f(X<I, I, int>); // #B\n"); //$NON-NLS-1$
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 2);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
[--Start Example(CPP 14.5.4.3-2):
|
|
||||||
template<class T> struct A {
|
|
||||||
template<class T2> struct B {}; // #1
|
|
||||||
template<class T2> struct B<T2*> {}; // #2
|
|
||||||
};
|
|
||||||
template<> template<class T2> struct A<short>::B {}; // #3
|
|
||||||
A<char>::B<int*> abcip; // uses #2
|
|
||||||
A<short>::B<int*> absip; // uses #3
|
|
||||||
A<char>::B<int> abci; // uses #1
|
|
||||||
--End Example]
|
|
||||||
*/
|
|
||||||
public void test14_5_4_3s2() { // TODO raised bug 90681
|
|
||||||
StringBuffer buffer = new StringBuffer();
|
|
||||||
buffer.append("template<class T> struct A {\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("template<class T2> struct B {}; // #1\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("template<class T2> struct B<T2*> {}; // #2\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("};\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("template<> template<class T2> struct A<short>::B {}; // #3\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("A<char>::B<int*> abcip; // uses #2\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("A<short>::B<int*> absip; // uses #3\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("A<char>::B<int> abci; // uses #1\n"); //$NON-NLS-1$
|
|
||||||
try {
|
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
|
||||||
assertTrue(false);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.5.5.1-5):
|
[--Start Example(CPP 14.5.5.1-5):
|
||||||
|
@ -873,33 +844,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
[--Start Example(CPP 14.7.3-17):
|
|
||||||
template<class T1> class A {
|
|
||||||
template<class T2> class B {
|
|
||||||
void mf();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
template<> template<> A<int>::B<double> { };
|
|
||||||
template<> template<> void A<char>::B<char>::mf() { };
|
|
||||||
--End Example]
|
|
||||||
*/
|
|
||||||
public void test14_7_3s17() { // TODO doesn't compile via g++
|
|
||||||
StringBuffer buffer = new StringBuffer();
|
|
||||||
buffer.append("template<class T1> class A {\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("template<class T2> class B {\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("void mf();\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("};\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("};\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("template<> template<> A<int>::B<double> { };\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("template<> template<> void A<char>::B<char>::mf() { };\n"); //$NON-NLS-1$
|
|
||||||
try {
|
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
|
||||||
assertTrue(false);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.8.2-2b):
|
[--Start Example(CPP 14.8.2-2b):
|
||||||
template <class T> int f(typename T::B*);
|
template <class T> int f(typename T::B*);
|
||||||
|
@ -911,7 +855,7 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
buffer.append("template <class T> int f(typename T::B*);\n"); //$NON-NLS-1$
|
buffer.append("template <class T> int f(typename T::B*);\n"); //$NON-NLS-1$
|
||||||
buffer.append("int i = f<int>(0);\n"); //$NON-NLS-1$
|
buffer.append("int i = f<int>(0);\n"); //$NON-NLS-1$
|
||||||
try {
|
try {
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 1);
|
||||||
assertTrue(false);
|
assertTrue(false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
|
@ -934,7 +878,7 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
buffer.append("int i = f<A>(0);\n"); //$NON-NLS-1$
|
buffer.append("int i = f<A>(0);\n"); //$NON-NLS-1$
|
||||||
buffer.append("int j = f<C>(0);\n"); //$NON-NLS-1$
|
buffer.append("int j = f<C>(0);\n"); //$NON-NLS-1$
|
||||||
try {
|
try {
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 2);
|
||||||
assertTrue(false);
|
assertTrue(false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -9133,6 +9133,32 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
[--Start Example(CPP 14.5.4.3-2):
|
||||||
|
template<class T> struct A {
|
||||||
|
template<class T2> struct B {}; // #1
|
||||||
|
template<class T2> struct B<T2*> {}; // #2
|
||||||
|
};
|
||||||
|
template<> template<class T2> struct A<short>::B {}; // #3
|
||||||
|
A<char>::B<int*> abcip; // uses #2
|
||||||
|
A<short>::B<int*> absip; // uses #3
|
||||||
|
A<char>::B<int> abci; // uses #1
|
||||||
|
--End Example]
|
||||||
|
*/
|
||||||
|
public void test14_5_4_3s2() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
buffer.append("template<class T> struct A {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("template<class T2> struct B {}; // #1\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("template<class T2> struct B<T2*> {}; // #2\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("};\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("template<> template<class T2> struct A<short>::B {}; // #3\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("A<char>::B<int*> abcip; // uses #2\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("A<short>::B<int*> absip; // uses #3\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("A<char>::B<int> abci; // uses #1\n"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.5.4-4):
|
[--Start Example(CPP 14.5.4-4):
|
||||||
template<class T1, class T2, int I> class A { }; // #1
|
template<class T1, class T2, int I> class A { }; // #1
|
||||||
|
@ -10324,6 +10350,29 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
[--Start Example(CPP 14.7.3-17):
|
||||||
|
template<class T1> class A {
|
||||||
|
template<class T2> class B {
|
||||||
|
void mf();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
template<> template<> A<int>::B<double> { };
|
||||||
|
template<> template<> void A<char>::B<char>::mf() { };
|
||||||
|
--End Example]
|
||||||
|
*/
|
||||||
|
public void test14_7_3s17() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
buffer.append("template<class T1> class A {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("template<class T2> class B {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void mf();\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("};\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("};\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("template<> template<> class A<int>::B<double> { };\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("template<> template<> void A<char>::B<char>::mf() { };\n"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.7.3-10):
|
[--Start Example(CPP 14.7.3-10):
|
||||||
template<class T> class X; // X is a class template
|
template<class T> class X; // X is a class template
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||||
|
@ -82,6 +83,9 @@ public class CPPClassInstanceScope implements ICPPClassScope {
|
||||||
binding = (IBinding) instanceMap.get( n );
|
binding = (IBinding) instanceMap.get( n );
|
||||||
} else {
|
} else {
|
||||||
binding = forceResolve ? n.resolveBinding() : n.getBinding();
|
binding = forceResolve ? n.resolveBinding() : n.getBinding();
|
||||||
|
if (binding instanceof ICPPClassTemplatePartialSpecialization ){
|
||||||
|
binding = null;
|
||||||
|
}
|
||||||
if( binding != null ){
|
if( binding != null ){
|
||||||
binding = CPPTemplates.createSpecialization( this, binding, instance.getArgumentMap() );
|
binding = CPPTemplates.createSpecialization( this, binding, instance.getArgumentMap() );
|
||||||
if( instanceMap == ObjectMap.EMPTY_MAP )
|
if( instanceMap == ObjectMap.EMPTY_MAP )
|
||||||
|
|
Loading…
Add table
Reference in a new issue