mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
fix template instances
This commit is contained in:
parent
f45b9b7692
commit
b3f9f20ed8
4 changed files with 75 additions and 58 deletions
|
@ -731,30 +731,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
[--Start Example(CPP 14.3-5):
|
|
||||||
template<class T> struct A {
|
|
||||||
~A();
|
|
||||||
};
|
|
||||||
void f(A<int>* p, A<int>* q) {
|
|
||||||
p->A<int>::~A(); // OK: destructor call
|
|
||||||
q->A<int>::~A<int>(); // OK: destructor call
|
|
||||||
}
|
|
||||||
--End Example]
|
|
||||||
*/
|
|
||||||
public void test14_3s5() throws Exception {
|
|
||||||
StringBuffer buffer = new StringBuffer();
|
|
||||||
buffer.append("template<class T> struct A {\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("~A();\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("};\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("void f(A<int>* p, A<int>* q) {\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("p->A<int>::~A(); // OK: destructor call\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("q->A<int>::~A<int>(); // OK: destructor call\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("}\n"); //$NON-NLS-1$
|
|
||||||
|
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.3.2-5):
|
[--Start Example(CPP 14.3.2-5):
|
||||||
|
@ -1041,39 +1017,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
[--Start Example(CPP 14.7.1-5):
|
|
||||||
template <class T> struct S {
|
|
||||||
operator int();
|
|
||||||
};
|
|
||||||
void f(int);
|
|
||||||
void f(S<int>&);
|
|
||||||
void f(S<float>);
|
|
||||||
void g(S<int>& sr) {
|
|
||||||
f(sr); //instantiation of S<int> allowed but not required
|
|
||||||
// instantiation of S<float> allowed but not required
|
|
||||||
};
|
|
||||||
--End Example]
|
|
||||||
*/
|
|
||||||
public void test14_7_1s5() { // TODO already have similar bug
|
|
||||||
StringBuffer buffer = new StringBuffer();
|
|
||||||
buffer.append("template <class T> struct S {\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("operator int();\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("};\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("void f(int);\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("void f(S<int>&);\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("void f(S<float>);\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("void g(S<int>& sr) {\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("f(sr); //instantiation of S<int> allowed but not required\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("// instantiation of S<float> allowed but not required\n"); //$NON-NLS-1$
|
|
||||||
buffer.append("};\n"); //$NON-NLS-1$
|
|
||||||
try {
|
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
|
||||||
assertTrue(false);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.7.2-2):
|
[--Start Example(CPP 14.7.2-2):
|
||||||
|
|
|
@ -8598,6 +8598,30 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
[--Start Example(CPP 14.3-5):
|
||||||
|
template<class T> struct A {
|
||||||
|
~A();
|
||||||
|
};
|
||||||
|
void f(A<int>* p, A<int>* q) {
|
||||||
|
p->A<int>::~A(); // OK: destructor call
|
||||||
|
q->A<int>::~A<int>(); // OK: destructor call
|
||||||
|
}
|
||||||
|
--End Example]
|
||||||
|
*/
|
||||||
|
public void test14_3s5() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
buffer.append("template<class T> struct A {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("~A();\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("};\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void f(A<int>* p, A<int>* q) {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("p->A<int>::~A(); // OK: destructor call\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("q->A<int>::~A<int>(); // OK: destructor call\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("}\n"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.3.1-2):
|
[--Start Example(CPP 14.3.1-2):
|
||||||
template <class T> class X { };
|
template <class T> class X { };
|
||||||
|
@ -9962,6 +9986,36 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
||||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
[--Start Example(CPP 14.7.1-5):
|
||||||
|
template <class T> struct S {
|
||||||
|
operator int();
|
||||||
|
};
|
||||||
|
void f(int);
|
||||||
|
void f(S<int>&);
|
||||||
|
void f(S<float>);
|
||||||
|
void g(S<int>& sr) {
|
||||||
|
f(sr); //instantiation of S<int> allowed but not required
|
||||||
|
// instantiation of S<float> allowed but not required
|
||||||
|
};
|
||||||
|
--End Example]
|
||||||
|
*/
|
||||||
|
public void test14_7_1s5() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
buffer.append("template <class T> struct S {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("operator int();\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("};\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void f(int);\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void f(S<int>&);\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void f(S<float>);\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void g(S<int>& sr) {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("f(sr); //instantiation of S<int> allowed but not required\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("// instantiation of S<float> allowed but not required\n"); //$NON-NLS-1$
|
||||||
|
buffer.append("};\n"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
parse(buffer.toString(), ParserLanguage.CPP, true, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
[--Start Example(CPP 14.7.1-10):
|
[--Start Example(CPP 14.7.1-10):
|
||||||
namespace N {
|
namespace N {
|
||||||
|
|
|
@ -838,4 +838,24 @@ public class AST2TemplateTests extends AST2BaseTest {
|
||||||
assertTrue( type instanceof IBasicType );
|
assertTrue( type instanceof IBasicType );
|
||||||
assertEquals( ((IBasicType)type).getType(), IBasicType.t_int );
|
assertEquals( ((IBasicType)type).getType(), IBasicType.t_int );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testInstances() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
buffer.append("template < class T > class A { \n"); //$NON-NLS-1$
|
||||||
|
buffer.append(" A< int > a; \n"); //$NON-NLS-1$
|
||||||
|
buffer.append("}; \n"); //$NON-NLS-1$
|
||||||
|
buffer.append("void f( A<int> p ) { } \n"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||||
|
CPPNameCollector col = new CPPNameCollector();
|
||||||
|
tu.accept( col );
|
||||||
|
|
||||||
|
ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding();
|
||||||
|
ICPPClassType A1 = (ICPPClassType) col.getName(2).resolveBinding();
|
||||||
|
ICPPClassType A2 = (ICPPClassType) col.getName(6).resolveBinding();
|
||||||
|
|
||||||
|
assertSame( A1, A2 );
|
||||||
|
assertTrue( A1 instanceof ICPPTemplateInstance );
|
||||||
|
assertSame( ((ICPPTemplateInstance)A1).getOriginalBinding(), A );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -210,7 +210,7 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
|
||||||
if( args.length == arguments.length ){
|
if( args.length == arguments.length ){
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for(; j < args.length; j++) {
|
for(; j < args.length; j++) {
|
||||||
if( !( args[j].equals( arguments[j] ) ) )
|
if( !( args[j].isSameType( arguments[j] ) ) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( j == args.length ){
|
if( j == args.length ){
|
||||||
|
|
Loading…
Add table
Reference in a new issue