From b3f9f20ed8365f30bbeb4d1ce5c720548c2fd28c Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 26 Apr 2005 21:39:26 +0000 Subject: [PATCH] fix template instances --- .../tests/ast2/AST2CPPSpecFailingTest.java | 57 ------------------- .../parser/tests/ast2/AST2CPPSpecTest.java | 54 ++++++++++++++++++ .../parser/tests/ast2/AST2TemplateTests.java | 20 +++++++ .../dom/parser/cpp/CPPTemplateDefinition.java | 2 +- 4 files changed, 75 insertions(+), 58 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java index 8ca8d1041bd..54118d9cf82 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java @@ -731,30 +731,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest { } catch (Exception e) { } } - - /** - [--Start Example(CPP 14.3-5): - template struct A { - ~A(); - }; - void f(A* p, A* q) { - p->A::~A(); // OK: destructor call - q->A::~A(); // OK: destructor call - } - --End Example] - */ - public void test14_3s5() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template struct A {\n"); //$NON-NLS-1$ - buffer.append("~A();\n"); //$NON-NLS-1$ - buffer.append("};\n"); //$NON-NLS-1$ - buffer.append("void f(A* p, A* q) {\n"); //$NON-NLS-1$ - buffer.append("p->A::~A(); // OK: destructor call\n"); //$NON-NLS-1$ - buffer.append("q->A::~A(); // 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): @@ -1041,39 +1017,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest { } catch (Exception e) { } } - - /** - [--Start Example(CPP 14.7.1-5): - template struct S { - operator int(); - }; - void f(int); - void f(S&); - void f(S); - void g(S& sr) { - f(sr); //instantiation of S allowed but not required - // instantiation of S allowed but not required - }; - --End Example] - */ - public void test14_7_1s5() { // TODO already have similar bug - StringBuffer buffer = new StringBuffer(); - buffer.append("template 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&);\n"); //$NON-NLS-1$ - buffer.append("void f(S);\n"); //$NON-NLS-1$ - buffer.append("void g(S& sr) {\n"); //$NON-NLS-1$ - buffer.append("f(sr); //instantiation of S allowed but not required\n"); //$NON-NLS-1$ - buffer.append("// instantiation of S 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): diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java index fd2c1dfba86..8cf5352a9b3 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java @@ -8598,6 +8598,30 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(buffer.toString(), ParserLanguage.CPP, true, 0); } + /** + [--Start Example(CPP 14.3-5): + template struct A { + ~A(); + }; + void f(A* p, A* q) { + p->A::~A(); // OK: destructor call + q->A::~A(); // OK: destructor call + } + --End Example] + */ + public void test14_3s5() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template struct A {\n"); //$NON-NLS-1$ + buffer.append("~A();\n"); //$NON-NLS-1$ + buffer.append("};\n"); //$NON-NLS-1$ + buffer.append("void f(A* p, A* q) {\n"); //$NON-NLS-1$ + buffer.append("p->A::~A(); // OK: destructor call\n"); //$NON-NLS-1$ + buffer.append("q->A::~A(); // 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): template class X { }; @@ -9962,6 +9986,36 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(buffer.toString(), ParserLanguage.CPP, true, 0); } + /** + [--Start Example(CPP 14.7.1-5): + template struct S { + operator int(); + }; + void f(int); + void f(S&); + void f(S); + void g(S& sr) { + f(sr); //instantiation of S allowed but not required + // instantiation of S allowed but not required + }; + --End Example] + */ + public void test14_7_1s5() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template 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&);\n"); //$NON-NLS-1$ + buffer.append("void f(S);\n"); //$NON-NLS-1$ + buffer.append("void g(S& sr) {\n"); //$NON-NLS-1$ + buffer.append("f(sr); //instantiation of S allowed but not required\n"); //$NON-NLS-1$ + buffer.append("// instantiation of S 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): namespace N { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 12cefa6a217..6d4b93dbcc8 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -838,4 +838,24 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue( type instanceof IBasicType ); 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 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 ); + } } 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 74f9a0ac674..012f1380824 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 @@ -210,7 +210,7 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I if( args.length == arguments.length ){ int j = 0; for(; j < args.length; j++) { - if( !( args[j].equals( arguments[j] ) ) ) + if( !( args[j].isSameType( arguments[j] ) ) ) break; } if( j == args.length ){