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 74508718300..08d2f650608 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 @@ -68,122 +68,118 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; * @author aniefer */ public class AST2TemplateTests extends AST2BaseTest { - + public AST2TemplateTests() { } - + public AST2TemplateTests(String name) { super(name); } - - public static TestSuite suite() { - return suite(AST2TemplateTests.class); - } - + + public static TestSuite suite() { + return suite(AST2TemplateTests.class); + } + public void testBasicClassTemplate() throws Exception { IASTTranslationUnit tu = parse( "template class A{ T t; };", ParserLanguage.CPP ); //$NON-NLS-1$ - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - - assertEquals( col.size(), 4 ); - ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); - ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); - - ICPPTemplateScope scope = (ICPPTemplateScope) T.getScope(); - IScope s2 = A.getScope(); - assertSame( scope, s2 ); - - ICPPField t = (ICPPField) col.getName(3).resolveBinding(); - ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(2).resolveBinding(); - - assertSame( T, T2 ); - IType type = t.getType(); - assertSame( type, T ); - - assertNotNull( T ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + assertEquals( col.size(), 4 ); + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); + + ICPPTemplateScope scope = (ICPPTemplateScope) T.getScope(); + IScope s2 = A.getScope(); + assertSame( scope, s2 ); + + ICPPField t = (ICPPField) col.getName(3).resolveBinding(); + ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(2).resolveBinding(); + + assertSame( T, T2 ); + IType type = t.getType(); + assertSame( type, T ); + + assertNotNull( T ); assertNotNull( A ); } - + + // template < class T > class A { + // T t1; + // T * t2; + // }; + // void f(){ + // A a; + // a.t1; a.t2; + // } public void testBasicTemplateInstance_1() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > class A { \n"); //$NON-NLS-1$ - buffer.append(" T t1; \n"); //$NON-NLS-1$ - buffer.append(" T * t2; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f(){ \n"); //$NON-NLS-1$ - buffer.append(" A a; \n"); //$NON-NLS-1$ - buffer.append(" a.t1; a.t2; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - - assertEquals( col.size(), 14 ); - - ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); - ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); - ICPPField t1 = (ICPPField) col.getName(3).resolveBinding(); - ICPPField t2 = (ICPPField) col.getName(5).resolveBinding(); - - assertSame( t1.getType(), T ); - assertSame( ((IPointerType)t2.getType()).getType(), T ); - - ICPPVariable a = (ICPPVariable) col.getName(9).resolveBinding(); - - ICPPClassType A_int = (ICPPClassType) col.getName(7).resolveBinding(); - assertSame( A_int, a.getType() ); - - assertTrue( A_int instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)A_int).getTemplateDefinition(), A ); - - ICPPClassScope A_int_Scope = (ICPPClassScope) A_int.getCompositeScope(); - assertNotSame( A_int_Scope, ((ICompositeType) A).getCompositeScope() ); - - ICPPField t = (ICPPField) col.getName(11).resolveBinding(); - assertTrue( t instanceof ICPPSpecialization ); - assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), t1 ); - assertSame( t.getScope(), A_int_Scope ); - IType type = t.getType(); - assertTrue( type instanceof IBasicType ); - assertEquals( ((IBasicType)type).getType(), IBasicType.t_int ); - - t = (ICPPField) col.getName(13).resolveBinding(); - assertTrue( t instanceof ICPPSpecialization ); - assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), t2 ); - assertSame( t.getScope(), A_int_Scope ); - type = t.getType(); - assertTrue( type instanceof IPointerType ); - assertTrue( ((IPointerType)type).getType() instanceof IBasicType ); - assertEquals( ((IBasicType)((IPointerType)type).getType()).getType(), IBasicType.t_int ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + assertEquals( col.size(), 14 ); + + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); + ICPPField t1 = (ICPPField) col.getName(3).resolveBinding(); + ICPPField t2 = (ICPPField) col.getName(5).resolveBinding(); + + assertSame( t1.getType(), T ); + assertSame( ((IPointerType)t2.getType()).getType(), T ); + + ICPPVariable a = (ICPPVariable) col.getName(9).resolveBinding(); + + ICPPClassType A_int = (ICPPClassType) col.getName(7).resolveBinding(); + assertSame( A_int, a.getType() ); + + assertTrue( A_int instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)A_int).getTemplateDefinition(), A ); + + ICPPClassScope A_int_Scope = (ICPPClassScope) A_int.getCompositeScope(); + assertNotSame( A_int_Scope, ((ICompositeType) A).getCompositeScope() ); + + ICPPField t = (ICPPField) col.getName(11).resolveBinding(); + assertTrue( t instanceof ICPPSpecialization ); + assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), t1 ); + assertSame( t.getScope(), A_int_Scope ); + IType type = t.getType(); + assertTrue( type instanceof IBasicType ); + assertEquals( ((IBasicType)type).getType(), IBasicType.t_int ); + + t = (ICPPField) col.getName(13).resolveBinding(); + assertTrue( t instanceof ICPPSpecialization ); + assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), t2 ); + assertSame( t.getScope(), A_int_Scope ); + type = t.getType(); + assertTrue( type instanceof IPointerType ); + assertTrue( ((IPointerType)type).getType() instanceof IBasicType ); + assertEquals( ((IBasicType)((IPointerType)type).getType()).getType(), IBasicType.t_int ); } - + + // template < class T > class A { + // T f( T *); + // }; + // void g(){ + // A a; + // a.f( (int*)0 ); + // } public void testBasicTemplateInstance_2() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > class A { \n"); //$NON-NLS-1$ - buffer.append(" T f( T *); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void g(){ \n"); //$NON-NLS-1$ - buffer.append(" A a; \n"); //$NON-NLS-1$ - buffer.append(" a.f( (int*)0 ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - - ICPPClassType A = (ICPPClassType) col.getName(1).resolveBinding(); - ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); - ICPPMethod f = (ICPPMethod) col.getName(3).resolveBinding(); - IFunctionType ft = f.getType(); - - assertSame( ft.getReturnType(), T ); - assertSame( ((IPointerType)ft.getParameterTypes()[0]).getType(), T ); - + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + ICPPClassType A = (ICPPClassType) col.getName(1).resolveBinding(); + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); + ICPPMethod f = (ICPPMethod) col.getName(3).resolveBinding(); + IFunctionType ft = f.getType(); + + assertSame( ft.getReturnType(), T ); + assertSame( ((IPointerType)ft.getParameterTypes()[0]).getType(), T ); + ICPPClassType A_int = (ICPPClassType) col.getName(7).resolveBinding(); assertTrue( A_int instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A_int).getTemplateDefinition(), A ); - + ICPPMethod f_int = (ICPPMethod) col.getName(11).resolveBinding(); assertTrue( f_int instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)f_int).getSpecializedBinding(), f ); @@ -191,75 +187,69 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue( ft.getReturnType() instanceof IBasicType ); assertTrue( ((IPointerType)ft.getParameterTypes()[0]).getType() instanceof IBasicType ); } - + + // template void f( T ); + // template void f( T ) { + // T * d; + // } + // void foo() { + // f( 0 ); + // } public void testBasicTemplateFunction() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f( T ); \n"); //$NON-NLS-1$ - buffer.append("template void f( T ) { \n"); //$NON-NLS-1$ - buffer.append(" T * d; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - buffer.append("void foo() { \n"); //$NON-NLS-1$ - buffer.append(" f( 0 ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - - ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); - ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); - - IParameter p1 = (IParameter) col.getName(3).resolveBinding(); - - ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(4).resolveBinding(); - ICPPFunction f2 = (ICPPFunction) col.getName(5).resolveBinding(); - IParameter p2 = (IParameter) col.getName(7).resolveBinding(); - - assertSame( T, T2 ); - assertSame( f, f2 ); - assertSame( p1, p2 ); - assertSame( p1.getType(), T ); - - ICPPFunction f3 = (ICPPFunction) col.getName(11).resolveBinding(); - assertTrue( f3 instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)f3).getTemplateDefinition(), f ); - - assertInstances( col, T, 5 ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); + + IParameter p1 = (IParameter) col.getName(3).resolveBinding(); + + ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(4).resolveBinding(); + ICPPFunction f2 = (ICPPFunction) col.getName(5).resolveBinding(); + IParameter p2 = (IParameter) col.getName(7).resolveBinding(); + + assertSame( T, T2 ); + assertSame( f, f2 ); + assertSame( p1, p2 ); + assertSame( p1.getType(), T ); + + ICPPFunction f3 = (ICPPFunction) col.getName(11).resolveBinding(); + assertTrue( f3 instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)f3).getTemplateDefinition(), f ); + + assertInstances( col, T, 5 ); } - + + // template < class T > class pair { + // template < class U > pair( const pair & ); + // }; public void testStackOverflow() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > class pair { \n"); //$NON-NLS-1$ - buffer.append(" template < class U > pair( const pair & ); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - - assertTrue( col.getName(0).resolveBinding() instanceof ICPPTemplateParameter ); - ICPPClassTemplate pair = (ICPPClassTemplate) col.getName(1).resolveBinding(); - ICPPTemplateParameter U = (ICPPTemplateParameter) col.getName(2).resolveBinding(); - assertTrue( col.getName(3).resolveBinding() instanceof ICPPFunctionTemplate ); - ICPPTemplateInstance pi = (ICPPTemplateInstance) col.getName(4).resolveBinding(); - ICPPClassTemplate p = (ICPPClassTemplate) col.getName(5).resolveBinding(); - ICPPTemplateParameter U2 = (ICPPTemplateParameter) col.getName(6).resolveBinding(); - - assertSame( U, U2 ); - assertSame( pair, p ); - assertSame( pi.getTemplateDefinition(), pair ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + assertTrue( col.getName(0).resolveBinding() instanceof ICPPTemplateParameter ); + ICPPClassTemplate pair = (ICPPClassTemplate) col.getName(1).resolveBinding(); + ICPPTemplateParameter U = (ICPPTemplateParameter) col.getName(2).resolveBinding(); + assertTrue( col.getName(3).resolveBinding() instanceof ICPPFunctionTemplate ); + ICPPTemplateInstance pi = (ICPPTemplateInstance) col.getName(4).resolveBinding(); + ICPPClassTemplate p = (ICPPClassTemplate) col.getName(5).resolveBinding(); + ICPPTemplateParameter U2 = (ICPPTemplateParameter) col.getName(6).resolveBinding(); + + assertSame( U, U2 ); + assertSame( pair, p ); + assertSame( pi.getTemplateDefinition(), pair ); } - + + // template < class T > class A {}; + // template < class T > class A< T* > {}; + // template < class T > class A< T** > {}; public void testBasicClassPartialSpecialization() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append( "template < class T > class A {}; \n "); //$NON-NLS-1$ - buffer.append( "template < class T > class A< T* > {}; \n "); //$NON-NLS-1$ - buffer.append( "template < class T > class A< T** > {}; \n "); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T1 = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(2).resolveBinding(); @@ -267,7 +257,7 @@ public class AST2TemplateTests extends AST2BaseTest { ICPPTemplateParameter T3 = (ICPPTemplateParameter) col.getName(5).resolveBinding(); ICPPClassTemplatePartialSpecialization A3 = (ICPPClassTemplatePartialSpecialization) col.getName(7).resolveBinding(); ICPPTemplateParameter T4 = (ICPPTemplateParameter) col.getName(6).resolveBinding(); - + assertSame( A2.getPrimaryClassTemplate(), A1 ); assertSame( A3.getPrimaryClassTemplate(), A1 ); assertNotSame( T1, T2 ); @@ -277,488 +267,432 @@ public class AST2TemplateTests extends AST2BaseTest { assertSame( T2, T3 ); assertNotSame( T2, T4 ); } - + + // template < class T > class A { typedef int TYPE; }; + // template < class T > A::TYPE foo( T ); + // template < class T > A::TYPE foo( T ); public void testStackOverflow_2() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append( "template < class T > class A { typedef int TYPE; }; \n"); //$NON-NLS-1$ - buffer.append( "template < class T > A::TYPE foo( T ); \n"); //$NON-NLS-1$ - buffer.append( "template < class T > A::TYPE foo( T ); \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T0 = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPTemplateParameter T1 = (ICPPTemplateParameter) col.getName(3).resolveBinding(); ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(12).resolveBinding(); - + assertNotSame( T0, T1 ); assertSame( T1, T2 ); - + ICPPFunctionTemplate foo1 = (ICPPFunctionTemplate) col.getName(9).resolveBinding(); ICPPFunctionTemplate foo2 = (ICPPFunctionTemplate) col.getName(18).resolveBinding(); assertSame( foo1, foo2 ); - + ITypedef TYPE = (ITypedef) col.getName(2).resolveBinding(); IBinding b0 = col.getName(8).resolveBinding(); assertInstance(b0, ICPPSpecialization.class); assertSame(TYPE, ((ICPPSpecialization) b0).getSpecializedBinding()); IBinding b1 = col.getName(17).resolveBinding(); assertSame(TYPE, ((ICPPSpecialization) b1).getSpecializedBinding()); - + assertInstances( col, T1, 6 ); } - + + // template < class T > class A { + // void f(); + // }; + // template < class T > void A::f() { } public void testTemplateMemberDef() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > class A { \n"); //$NON-NLS-1$ - buffer.append(" void f(); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template < class T > void A::f() { } \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPMethod f1 = (ICPPMethod) col.getName(2).resolveBinding(); ICPPMethod f2 = (ICPPMethod) col.getName(8).resolveBinding(); - + assertSame( f2, f1 ); } - + + // template < class T > void f ( T ); + // void main() { + // f( 1 ); + // } public void testTemplateFunctionImplicitInstantiation() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > void f ( T ); \n"); //$NON-NLS-1$ - buffer.append("void main() { \n"); //$NON-NLS-1$ - buffer.append(" f( 1 ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); IFunction f2 = (IFunction) col.getName(5).resolveBinding(); - + assertTrue( f2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f1 ); } - - /** - * template< class T > void f( T ); //#1 - * template< class T > void f( T* ); //#2 - * template< class T > void f( const T* ); //#3 - * - * const int *p; - * f( p ); //calls f( const T * ) , 3 is more specialized than 1 or 2 - * - * @throws Exception - * - */ + + // template < class T > void f( T ); // #1 + // template < class T > void f( T* ); // #2 + // template < class T > void f( const T* ); // #3 + // void main() { + // const int *p; + // f( p ); //calls f( const T * ) , 3 is more specialized than 1 or 2 + // } public void test_14_5_5_2s5_OrderingFunctionTemplates_1() throws Exception{ - StringBuffer buffer = new StringBuffer(); - buffer.append( "template < class T > void f( T ); \n"); //$NON-NLS-1$ - buffer.append( "template < class T > void f( T* ); \n"); //$NON-NLS-1$ - buffer.append( "template < class T > void f( const T* ); \n"); //$NON-NLS-1$ - buffer.append( "void main() { \n"); //$NON-NLS-1$ - buffer.append( " const int *p; \n"); //$NON-NLS-1$ - buffer.append( " f( p ); \n"); //$NON-NLS-1$ - buffer.append( "} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunctionTemplate f2 = (ICPPFunctionTemplate) col.getName(5).resolveBinding(); ICPPFunctionTemplate f3 = (ICPPFunctionTemplate) col.getName(9).resolveBinding(); - + assertNotSame( f1, f2 ); assertNotSame( f2, f3 ); assertNotSame( f3, f1 ); - + IFunction f = (IFunction) col.getName(14).resolveBinding(); assertTrue( f instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)f).getTemplateDefinition(), f3 ); } - - /** - * template< class T > void g( T ); //#1 - * template< class T > void g( T& ); //#2 - - * float x; - * g( x ); //ambiguous 1 or 2 - * - * @throws Exception - */ + + // template < class T > void f( T ); // #1 + // template < class T > void f( T& ); // #2 + // void main() { + // float x; + // f( x ); //ambiguous 1 or 2 + // } public void test_14_5_5_2s5_OrderingFunctionTemplates_2() throws Exception{ - StringBuffer buffer = new StringBuffer(); - buffer.append( "template < class T > void f( T ); \n"); //$NON-NLS-1$ - buffer.append( "template < class T > void f( T& ); \n"); //$NON-NLS-1$ - buffer.append( "void main() { \n"); //$NON-NLS-1$ - buffer.append( " float x; \n"); //$NON-NLS-1$ - buffer.append( " f( x ); \n"); //$NON-NLS-1$ - buffer.append( "} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunctionTemplate f2 = (ICPPFunctionTemplate) col.getName(5).resolveBinding(); - + assertNotSame( f1, f2 ); - + IProblemBinding f = (IProblemBinding) col.getName(10).resolveBinding(); assertEquals( f.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP ); } - + + // template < class T, template < class X > class U, T *pT > class A { + // }; public void testTemplateParameters() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append( "template < class T, template < class X > class U, T *pT > class A { \n"); //$NON-NLS-1$ - buffer.append( "}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateTypeParameter T = (ICPPTemplateTypeParameter) col.getName(0).resolveBinding(); ICPPTemplateTemplateParameter U = (ICPPTemplateTemplateParameter) col.getName(2).resolveBinding(); ICPPTemplateNonTypeParameter pT = (ICPPTemplateNonTypeParameter) col.getName(4).resolveBinding(); - + ICPPTemplateTypeParameter X = (ICPPTemplateTypeParameter) col.getName(1).resolveBinding(); - + ICPPTemplateParameter [] ps = U.getTemplateParameters(); assertEquals( ps.length, 1 ); assertSame( ps[0], X ); - + IPointerType ptype = (IPointerType) pT.getType(); assertSame( ptype.getType(), T ); } - + + // template class A { + // A* a; + // A* a2; + // }; + // void f(){ + // A * b; + // b->a; + // } public void testDeferredInstances() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append( "template class A { \n"); //$NON-NLS-1$ - buffer.append( " A* a; \n"); //$NON-NLS-1$ - buffer.append( " A* a2; \n"); //$NON-NLS-1$ - buffer.append( "}; \n"); //$NON-NLS-1$ - buffer.append( "void f(){ \n"); //$NON-NLS-1$ - buffer.append( " A * b; \n"); //$NON-NLS-1$ - buffer.append( " b->a; \n"); //$NON-NLS-1$ - buffer.append( "} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPTemplateInstance A_T = (ICPPTemplateInstance) col.getName(2).resolveBinding(); assertSame( A_T.getTemplateDefinition(), A ); - + ICPPTemplateInstance A_T2 = (ICPPTemplateInstance) col.getName(6).resolveBinding(); assertSame( A_T, A_T2 ); - + ICPPVariable a = (ICPPVariable) col.getName(5).resolveBinding(); IPointerType pt = (IPointerType) a.getType(); assertSame( pt.getType(), A_T ); - + ICPPVariable b = (ICPPVariable) col.getName(13).resolveBinding(); IType bt = b.getType(); assertTrue( bt instanceof IPointerType ); - + ICPPVariable a2 = (ICPPVariable) col.getName(15).resolveBinding(); assertTrue( a2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)a2).getSpecializedBinding(), a ); IType at = a2.getType(); assertTrue( at instanceof IPointerType ); - + assertSame( ((IPointerType)at).getType(), ((IPointerType)bt).getType() ); } - + + // template < class T1, class T2, int I > class A {}; //#1 + // template < class T, int I > class A < T, T*, I > {}; //#2 + // template < class T1, class T2, int I > class A < T1*, T2, I > {}; //#3 + // template < class T > class A < int, T*, 5 > {}; //#4 + // template < class T1, class T2, int I > class A < T1, T2*, I > {}; //#5 + // + // A a1; //uses #1 + // A a2; //uses #2, T is int, I is 1 + // A a3; //uses #4, T is char + // A a4; //uses #5, T is int, T2 is char, I is1 + // A a5; //ambiguous, matches #3 & #5. public void test_14_5_4_1s2_MatchingTemplateSpecializations() throws Exception{ - StringBuffer buffer = new StringBuffer(); - buffer.append( "template < class T1, class T2, int I > class A {}; //#1 \n"); //$NON-NLS-1$ - buffer.append( "template < class T, int I > class A < T, T*, I > {}; //#2 \n"); //$NON-NLS-1$ - buffer.append( "template < class T1, class T2, int I > class A < T1*, T2, I > {}; //#3 \n"); //$NON-NLS-1$ - buffer.append( "template < class T > class A < int, T*, 5 > {}; //#4 \n"); //$NON-NLS-1$ - buffer.append( "template < class T1, class T2, int I > class A < T1, T2*, I > {}; //#5 \n"); //$NON-NLS-1$ - - buffer.append( "A a1; //uses #1 \n"); //$NON-NLS-1$ - buffer.append( "A a2; //uses #2, T is int, I is 1 \n"); //$NON-NLS-1$ - buffer.append( "A a3; //uses #4, T is char \n"); //$NON-NLS-1$ - buffer.append( "A a4; //uses #5, T is int, T2 is char, I is1 \n"); //$NON-NLS-1$ - buffer.append( "A a5; //ambiguous, matches #3 & #5. \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(3).resolveBinding(); ICPPClassTemplate A2 = (ICPPClassTemplate) col.getName(6).resolveBinding(); ICPPClassTemplate A3 = (ICPPClassTemplate) col.getName(14).resolveBinding(); ICPPClassTemplate A4 = (ICPPClassTemplate) col.getName(20).resolveBinding(); ICPPClassTemplate A5 = (ICPPClassTemplate) col.getName(26).resolveBinding(); - + assertTrue( A3 instanceof ICPPClassTemplatePartialSpecialization ); assertSame( ((ICPPClassTemplatePartialSpecialization)A3).getPrimaryClassTemplate(), A1 ); - + ICPPTemplateTypeParameter T1 = (ICPPTemplateTypeParameter) col.getName(11).resolveBinding(); ICPPTemplateTypeParameter T2 = (ICPPTemplateTypeParameter) col.getName(12).resolveBinding(); ICPPTemplateNonTypeParameter I = (ICPPTemplateNonTypeParameter) col.getName(13).resolveBinding(); - + ICPPTemplateParameter TR1 = (ICPPTemplateParameter) col.getName(16).resolveBinding(); ICPPTemplateParameter TR2 = (ICPPTemplateParameter) col.getName(17).resolveBinding(); ICPPTemplateParameter TR3 = (ICPPTemplateParameter) col.getName(18).resolveBinding(); - + assertSame( T1, TR1 ); assertSame( T2, TR2 ); assertSame( I, TR3 ); - + ICPPTemplateInstance R1 = (ICPPTemplateInstance) col.getName(31).resolveBinding(); ICPPTemplateInstance R2 = (ICPPTemplateInstance) col.getName(34).resolveBinding(); ICPPTemplateInstance R3 = (ICPPTemplateInstance) col.getName(37).resolveBinding(); ICPPTemplateInstance R4 = (ICPPTemplateInstance) col.getName(40).resolveBinding(); IProblemBinding R5 = (IProblemBinding) col.getName(43).resolveBinding(); assertEquals( R5.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP ); - + assertSame( R1.getTemplateDefinition(), A1 ); assertSame( R2.getTemplateDefinition(), A2 ); assertSame( R4.getTemplateDefinition(), A5 ); assertSame( R3.getTemplateDefinition(), A4 ); } - + + // template void f(T); + // template void f(T*); + // template <> void f(int); //ok + // template <> void f(int*); //ok public void test14_7_3_FunctionExplicitSpecialization() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f(T); \n"); //$NON-NLS-1$ - buffer.append("template void f(T*); \n"); //$NON-NLS-1$ - buffer.append("template <> void f(int); //ok \n"); //$NON-NLS-1$ - buffer.append("template <> void f(int*); //ok \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate fT1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunctionTemplate fT2 = (ICPPFunctionTemplate) col.getName(5).resolveBinding(); - + ICPPSpecialization f1 = (ICPPSpecialization) col.getName(8).resolveBinding(); ICPPSpecialization f2 = (ICPPSpecialization) col.getName(10).resolveBinding(); - + assertSame( f1.getSpecializedBinding(), fT1 ); assertSame( f2.getSpecializedBinding(), fT2 ); } - + + // template void f(T*); + // void g(int* p) { f(p); } public void test_14_5_5_1_FunctionTemplates_1() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f(T*); \n"); //$NON-NLS-1$ - buffer.append("void g(int* p) { f(p); } \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); - + ICPPFunction ref = (ICPPFunction) col.getName(6).resolveBinding(); assertTrue( ref instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)ref).getTemplateDefinition(), f ); } - + + // template void f(T); + // void g(int* p) { f(p); } public void test_14_5_5_1_FunctionTemplates_2() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f(T); \n"); //$NON-NLS-1$ - buffer.append("void g(int* p) { f(p); } \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); - + ICPPFunction ref = (ICPPFunction) col.getName(6).resolveBinding(); assertTrue( ref instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)ref).getTemplateDefinition(), f ); } - + + // template X f(Y); + // void g(){ + // int i = f(5); // Y is int + // } public void test_14_8_1s2_FunctionTemplates() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template X f(Y); \n"); //$NON-NLS-1$ - buffer.append("void g(){ \n"); //$NON-NLS-1$ - buffer.append(" int i = f(5); // Y is int \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(3).resolveBinding(); ICPPFunction ref1 = (ICPPFunction) col.getName(8).resolveBinding(); - + assertTrue( ref1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance) ref1).getTemplateDefinition(), f ); } - + + // template void f(T); + // void g(){ + // f("Annemarie"); + // } public void test14_8_3s6_FunctionTemplates() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f(T); \n"); //$NON-NLS-1$ - buffer.append("void g(){ \n"); //$NON-NLS-1$ - buffer.append(" f(\"Annemarie\"); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunction ref = (ICPPFunction) col.getName(5).resolveBinding(); assertTrue( ref instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)ref).getTemplateDefinition(), f ); } - + + // template void f(T); // #1 + // template void f(T*, int=1); // #2 + // template void g(T); // #3 + // template void g(T*, ...); // #4 + // int main() { + // int* ip; + // f(ip); //calls #2 + // g(ip); //calls #4 + // } public void test14_5_5_2s6_FunctionTemplates() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f(T); // #1\n"); //$NON-NLS-1$ - buffer.append("template void f(T*, int=1); // #2\n"); //$NON-NLS-1$ - buffer.append("template void g(T); // #3\n"); //$NON-NLS-1$ - buffer.append("template void g(T*, ...); // #4\n"); //$NON-NLS-1$ - buffer.append("int main() { \n"); //$NON-NLS-1$ - buffer.append(" int* ip; \n"); //$NON-NLS-1$ - buffer.append(" f(ip); //calls #2\n"); //$NON-NLS-1$ - buffer.append(" g(ip); //calls #4\n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunctionTemplate f2 = (ICPPFunctionTemplate) col.getName(5).resolveBinding(); assertNotSame( f1, f2 ); - + ICPPFunctionTemplate g1 = (ICPPFunctionTemplate) col.getName(10).resolveBinding(); ICPPFunctionTemplate g2 = (ICPPFunctionTemplate) col.getName(14).resolveBinding(); assertNotSame( g1, g2 ); - + ICPPFunction ref1 = (ICPPFunction) col.getName(19).resolveBinding(); ICPPFunction ref2 = (ICPPFunction) col.getName(21).resolveBinding(); - + assertTrue( ref1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance) ref1).getTemplateDefinition(), f2 ); - + assertTrue( ref2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance) ref2).getTemplateDefinition(), g2 ); } - + + // template class X { + // X* p; // meaning X + // X* p2; + // }; public void test14_6_1s1_LocalNames() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class X { \n"); //$NON-NLS-1$ - buffer.append(" X* p; // meaning X\n"); //$NON-NLS-1$ - buffer.append(" X* p2; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate X = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPClassType x1 = (ICPPClassType) col.getName(2).resolveBinding(); ICPPClassType x2 = (ICPPClassType) col.getName(4).resolveBinding(); - + assertTrue( x1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)x1).getTemplateDefinition(), X ); - + assertSame( x1, x2 ); } - + + // template T f(T* p){ + // }; + // void g(int a, char* b){ + // f(&a); //call f(int*) + // f(&b); //call f(char**) + // } public void test14_8s2_() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template T f(T* p){ \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void g(int a, char* b){ \n"); //$NON-NLS-1$ - buffer.append(" f(&a); //call f(int*) \n"); //$NON-NLS-1$ - buffer.append(" f(&b); //call f(char**)\n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(2).resolveBinding(); - + ICPPFunction f1 = (ICPPFunction) col.getName(8).resolveBinding(); ICPPFunction f2 = (ICPPFunction) col.getName(10).resolveBinding(); - + assertNotSame( f1, f2 ); assertTrue( f1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)f1).getTemplateDefinition(), f ); assertTrue( f2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f ); - + IType fr1 = f1.getType().getReturnType(); IType fr2 = f2.getType().getReturnType(); - + assertTrue( fr1 instanceof IBasicType ); assertEquals( ((IBasicType)fr1).getType(), IBasicType.t_int ); - + assertTrue( fr2 instanceof IPointerType ); assertTrue( ((IPointerType)fr2).getType() instanceof IBasicType ); assertEquals( ((IBasicType) ((IPointerType)fr2).getType()).getType(), IBasicType.t_char ); } - + + // template void f(T) { } + // template inline T g(T) { } + // template<> inline void f<>(int) { } //OK: inline + // template<> int g<>(int) { } // OK: not inline public void test14_7_3s14() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f(T) { } \n"); //$NON-NLS-1$ - buffer.append("template inline T g(T) { } \n"); //$NON-NLS-1$ - buffer.append("template<> inline void f<>(int) { } //OK: inline \n"); //$NON-NLS-1$ - buffer.append("template<> int g<>(int) { } // OK: not inline\n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunctionTemplate g1 = (ICPPFunctionTemplate) col.getName(6).resolveBinding(); - + ICPPSpecialization f2 = (ICPPSpecialization) col.getName(9).resolveBinding(); ICPPSpecialization g2 = (ICPPSpecialization) col.getName(12).resolveBinding(); - + assertSame( f2.getSpecializedBinding(), f1 ); assertSame( g2.getSpecializedBinding(), g1 ); - + assertFalse( ((ICPPFunction)f1).isInline() ); assertTrue( ((ICPPFunction)g1).isInline() ); assertTrue( ((ICPPFunction)f2).isInline() ); assertFalse( ((ICPPFunction)g2).isInline() ); } - + + // template class X { + // X a; // implicit generation of X requires + // // the implicit instantiation of X which requires + // // the implicit instantiation of X which ... + // }; + // void f() { + // X x; + // x.a.a.a.a; + // } public void test14_7_1s14_InfiniteInstantiation() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class X { \n"); //$NON-NLS-1$ - buffer.append(" X a; // implicit generation of X requires \n"); //$NON-NLS-1$ - buffer.append(" // the implicit instantiation of X which requires \n"); //$NON-NLS-1$ - buffer.append(" // the implicit instantiation of X which ... \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" X x; \n"); //$NON-NLS-1$ - buffer.append(" x.a.a.a.a; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate X = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPVariable x = (ICPPVariable) col.getName(9).resolveBinding(); IType t = x.getType(); assertTrue( t instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance) t).getTemplateDefinition(), X ); - + ICPPField a = (ICPPField) col.getName(5).resolveBinding(); ICPPField a1 = (ICPPField) col.getName(11).resolveBinding(); ICPPField a2 = (ICPPField) col.getName(12).resolveBinding(); ICPPField a3 = (ICPPField) col.getName(13).resolveBinding(); ICPPField a4 = (ICPPField) col.getName(14).resolveBinding(); - + assertTrue( a1 instanceof ICPPSpecialization ); assertTrue( a2 instanceof ICPPSpecialization ); assertTrue( a3 instanceof ICPPSpecialization ); @@ -768,426 +702,400 @@ public class AST2TemplateTests extends AST2BaseTest { assertSame( ((ICPPSpecialization)a3).getSpecializedBinding(), a ); assertSame( ((ICPPSpecialization)a4).getSpecializedBinding(), a ); } - + + // template class Y; + // template<> class Y { + // Y* p; // meaning Y + // Y* q; // meaning Y + // }; public void test14_6_1s2() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class Y; \n"); //$NON-NLS-1$ - buffer.append("template<> class Y { \n"); //$NON-NLS-1$ - buffer.append(" Y* p; // meaning Y \n"); //$NON-NLS-1$ - buffer.append(" Y* q; // meaning Y \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate Y = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPSpecialization Yspec = (ICPPSpecialization) col.getName(2).resolveBinding(); - + assertTrue( Yspec instanceof ICPPClassType ); assertSame( Yspec.getSpecializedBinding(), Y ); - + ICPPClassType y1 = (ICPPClassType) col.getName(4).resolveBinding(); assertSame( y1, Yspec ); - + ICPPClassType y2 = (ICPPClassType) col.getName(6).resolveBinding(); assertTrue( y2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)y2).getTemplateDefinition(), Y ); } - + + // template < class T, class U > void f ( T (*) ( T, U ) ); + // int g ( int, char ); + // void foo () { + // f( g ); + // } public void testBug45129() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T, class U > void f ( T (*) ( T, U ) ); \n"); //$NON-NLS-1$ - buffer.append("int g ( int, char ); \n"); //$NON-NLS-1$ - buffer.append("void foo () { \n"); //$NON-NLS-1$ - buffer.append(" f( g ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - - ICPPFunction f1 = (ICPPFunction) col.getName(2).resolveBinding(); - ICPPFunction g1 = (ICPPFunction) col.getName(9).resolveBinding(); - - IBinding f2 = col.getName(13).resolveBinding(); - IBinding g2 = col.getName(14).resolveBinding(); - - assertTrue( f2 instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f1 ); - assertSame( g1, g2 ); + + ICPPFunction f1 = (ICPPFunction) col.getName(2).resolveBinding(); + ICPPFunction g1 = (ICPPFunction) col.getName(9).resolveBinding(); + + IBinding f2 = col.getName(13).resolveBinding(); + IBinding g2 = col.getName(14).resolveBinding(); + + assertTrue( f2 instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f1 ); + assertSame( g1, g2 ); } - + + // template U f( T ); + // void g() { + // f( 1 ); + // } public void testBug76951_1() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template U f( T ); \n"); //$NON-NLS-1$ - buffer.append("void g() { \n"); //$NON-NLS-1$ - buffer.append(" f( 1 ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(2).resolveBinding(); assertSame( T, T2 ); - + ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(4).resolveBinding(); ICPPFunction f2 = (ICPPFunction) col.getName(8).resolveBinding(); - + assertTrue( f2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f1 ); - + IFunctionType ft = f2.getType(); assertTrue( ft.getReturnType() instanceof IBasicType ); assertEquals( ((IBasicType)ft.getReturnType()).getType(), IBasicType.t_int ); } - + + // template class A { + // U u; + // }; + // void f() { + // A a; + // a.u; + // } public void testBug76951_2() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" U u; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" A a; \n"); //$NON-NLS-1$ - buffer.append(" a.u; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPTemplateTypeParameter U = (ICPPTemplateTypeParameter) col.getName(1).resolveBinding(); assertSame( U.getDefault(), T ); - + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(3).resolveBinding(); ICPPField u1 = (ICPPField) col.getName(5).resolveBinding(); assertSame( u1.getType(), U ); - + ICPPClassType A1 = (ICPPClassType) col.getName(7).resolveBinding(); assertTrue( A1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A1).getTemplateDefinition(), A ); - + ICPPField u2 = (ICPPField) col.getName(11).resolveBinding(); assertTrue( u2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)u2).getSpecializedBinding(), u1 ); - + IType type = u2.getType(); assertTrue( type instanceof IBasicType ); assertEquals( ((IBasicType)type).getType(), IBasicType.t_int ); } - + + // template < class T > class A { + // A< int > a; + // }; + // void f( A p ) { } 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 ); + IASTTranslationUnit tu = parse( getAboveComment(), 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).getTemplateDefinition(), A ); } - + + // template void f( T ); + // template void f( T ) {} public void testTemplateParameterDeclarations() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append( "template void f( T ); \n"); //$NON-NLS-1$ - buffer.append( "template void f( T ) {} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T1 = (ICPPTemplateParameter) col.getName(4).resolveBinding(); ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(2).resolveBinding(); - + assertSame( T1, T2 ); - + assertInstances( col, T1, 4 ); } - + + // template < class T > class A { + // int f( A * ); + // A < T > *pA; + // }; + // void f () { + // A< int > *a; + // a->f( a ); + // a->pA; + // }; public void testDeferredInstantiation() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > class A { \n"); //$NON-NLS-1$ - buffer.append(" int f( A * ); \n"); //$NON-NLS-1$ - buffer.append(" A < T > *pA; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f () { \n"); //$NON-NLS-1$ - buffer.append(" A< int > *a; \n"); //$NON-NLS-1$ - buffer.append(" a->f( a ); \n"); //$NON-NLS-1$ - buffer.append(" a->pA; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPMethod f = (ICPPMethod) col.getName(2).resolveBinding(); ICPPClassType A1 = (ICPPClassType) col.getName(3).resolveBinding(); ICPPClassType A2 = (ICPPClassType) col.getName(5).resolveBinding(); ICPPField pA = (ICPPField) col.getName(8).resolveBinding(); - + assertSame( A1, A2 ); assertTrue( A1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A1).getTemplateDefinition(), A ); - + ICPPClassType AI = (ICPPClassType) col.getName(10).resolveBinding(); ICPPMethod f2 = (ICPPMethod) col.getName(14).resolveBinding(); ICPPField pA2 = (ICPPField) col.getName(17).resolveBinding(); - + assertTrue( f2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)f2).getSpecializedBinding(), f ); assertTrue( pA2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)pA2).getSpecializedBinding(), pA ); - + IType paT = pA2.getType(); assertTrue( paT instanceof IPointerType ); assertSame( ((IPointerType)paT).getType(), AI ); - + IParameter p = f2.getParameters()[0]; IType pT = p.getType(); assertTrue( pT instanceof IPointerType ); assertSame( ((IPointerType)pT).getType(), AI ); } - + + // template struct A { + // void f(int); + // template void f(T2); + // }; + // template <> void A::f(int) { } //nontemplate + // template <> template <> void A::f<>(int) { } //template + // int main() { + // A ac; + // ac.f(1); //nontemplate + // ac.f('c'); //template + // ac.f<>(1); //template + // } public void test14_5_2s2_MemberSpecializations() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template struct A { \n"); //$NON-NLS-1$ - buffer.append(" void f(int); \n"); //$NON-NLS-1$ - buffer.append(" template void f(T2); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template <> void A::f(int) { } //nontemplate \n"); //$NON-NLS-1$ - buffer.append("template <> template <> void A::f<>(int) { } //template \n"); //$NON-NLS-1$ - buffer.append("int main() { \n"); //$NON-NLS-1$ - buffer.append(" A ac; \n"); //$NON-NLS-1$ - buffer.append(" ac.f(1); //nontemplate \n"); //$NON-NLS-1$ - buffer.append(" ac.f('c'); //template \n"); //$NON-NLS-1$ - buffer.append(" ac.f<>(1); //template \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPMethod f1 = (ICPPMethod) col.getName(2).resolveBinding(); ICPPMethod f2 = (ICPPMethod) col.getName(5).resolveBinding(); - + ICPPMethod f1_2 = (ICPPMethod) col.getName(11).resolveBinding(); assertNotSame( f1, f1_2 ); assertTrue( f1_2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)f1_2).getSpecializedBinding(), f1 ); - + ICPPClassType A2 = (ICPPClassType) col.getName(9).resolveBinding(); assertTrue( A2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A2).getTemplateDefinition(), A ); - + ICPPMethod f2_2 = (ICPPMethod) col.getName(16).resolveBinding(); assertTrue( f2_2 instanceof ICPPSpecialization ); IBinding speced = ((ICPPSpecialization)f2_2).getSpecializedBinding(); assertTrue( speced instanceof ICPPFunctionTemplate && speced instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)speced).getSpecializedBinding(), f2 ); - + ICPPClassType A3 = (ICPPClassType) col.getName(14).resolveBinding(); assertSame( A2, A3 ); - + ICPPClassType A4 = (ICPPClassType) col.getName(20).resolveBinding(); assertSame( A2, A4 ); - + IFunction r1 = (IFunction) col.getName(24).resolveBinding(); IFunction r2 = (IFunction) col.getName(26).resolveBinding(); IFunction r3 = (IFunction) col.getName(28).resolveBinding(); - + assertSame( r1, f1_2 ); assertTrue( r2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)r2).getTemplateDefinition(), speced ); assertSame( r3, f2_2 ); } - + + // template class A { }; + // template <> class A {}; + // A ac; + // A ai; public void testClassSpecializations() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { }; \n"); //$NON-NLS-1$ - buffer.append("template <> class A {}; \n"); //$NON-NLS-1$ - buffer.append("A ac; \n"); //$NON-NLS-1$ - buffer.append("A ai; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPClassType A2 = (ICPPClassType) col.getName(2).resolveBinding(); - + assertTrue( A2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)A2).getSpecializedBinding(), A1 ); - + ICPPClassType r1 = (ICPPClassType) col.getName(4).resolveBinding(); ICPPClassType r2 = (ICPPClassType) col.getName(7).resolveBinding(); - + assertTrue( r1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)r1).getTemplateDefinition(), A1 ); assertSame( r2, A2 ); } - + + // template struct A { + // void f(T) { } + // }; + // template<> struct A { + // void f(int); + // }; + // void h(){ + // A a; + // a.f(16); // A::f must be defined somewhere + // } + // // explicit specialization syntax not used for a member of + // // explicitly specialized class template specialization + // void A::f(int) { } public void test14_7_3s5_SpecializationMemberDefinition() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template struct A { \n"); //$NON-NLS-1$ - buffer.append(" void f(T) { } \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template<> struct A { \n"); //$NON-NLS-1$ - buffer.append(" void f(int); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void h(){ \n"); //$NON-NLS-1$ - buffer.append(" A a; \n"); //$NON-NLS-1$ - buffer.append(" a.f(16); // A::f must be defined somewhere \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - buffer.append("// explicit specialization syntax not used for a member of \n"); //$NON-NLS-1$ - buffer.append("// explicitly specialized class template specialization \n"); //$NON-NLS-1$ - buffer.append("void A::f(int) { } \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPMethod f1 = (ICPPMethod) col.getName(2).resolveBinding(); - + ICPPClassType A2 = (ICPPClassType) col.getName(5).resolveBinding(); assertTrue( A2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)A2).getSpecializedBinding(), A1 ); - + ICPPMethod f2 = (ICPPMethod) col.getName(7).resolveBinding(); assertNotSame( f1, f2 ); - + ICPPClassType A3 = (ICPPClassType) col.getName(10).resolveBinding(); assertSame( A3, A2 ); ICPPMethod f3 = (ICPPMethod) col.getName(14).resolveBinding(); assertSame( f3, f2 ); - + ICPPClassType A4 = (ICPPClassType) col.getName(16).resolveBinding(); assertSame( A4, A2 ); ICPPMethod f4 = (ICPPMethod) col.getName(18).resolveBinding(); assertSame( f4, f3 ); } - + + // class C{}; + // template class A { + // template class B { + // T f( T2 ); + // }; + // }; + // void g(){ + // A::B b; + // C c; + // b.f( c ); + // } public void testNestedSpecializations() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("class C{}; \n"); //$NON-NLS-1$ - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" template class B { \n"); //$NON-NLS-1$ - buffer.append(" T f( T2 ); \n"); //$NON-NLS-1$ - buffer.append(" }; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void g(){ \n"); //$NON-NLS-1$ - buffer.append(" A::B b; \n"); //$NON-NLS-1$ - buffer.append(" C c; \n"); //$NON-NLS-1$ - buffer.append(" b.f( c ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassType C = (ICPPClassType) col.getName(0).resolveBinding(); ICPPClassTemplate A = (ICPPClassTemplate) col.getName(2).resolveBinding(); ICPPClassTemplate B = (ICPPClassTemplate) col.getName(4).resolveBinding(); ICPPMethod f = (ICPPMethod) col.getName(6).resolveBinding(); - + ICPPClassType A1 = (ICPPClassType) col.getName(11).resolveBinding(); assertTrue( A1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A1).getTemplateDefinition(), A ); - + ICPPClassType B1 = (ICPPClassType) col.getName(13).resolveBinding(); assertTrue( B1 instanceof ICPPTemplateInstance ); ICPPClassType B2 = (ICPPClassType) ((ICPPTemplateInstance)B1).getTemplateDefinition(); assertTrue( B2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)B2).getSpecializedBinding(), B ); - + ICPPMethod f1 = (ICPPMethod) col.getName(20).resolveBinding(); assertTrue( f1 instanceof ICPPSpecialization ); assertTrue( ((ICPPSpecialization)f1).getSpecializedBinding() instanceof ICPPMethod ); ICPPMethod f2 = (ICPPMethod) ((ICPPSpecialization)f1).getSpecializedBinding(); assertTrue( f2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)f2).getSpecializedBinding(), f ); - + IFunctionType ft = f1.getType(); assertTrue( ft.getReturnType() instanceof IBasicType ); assertEquals( ((IBasicType)ft.getReturnType()).getType(), IBasicType.t_int ); - + assertSame( ft.getParameterTypes()[0], C ); } - + + // namespace N { + // template class A { }; + // } + // using N::A; + // namespace N { + // template class A { }; + // } + // A a; public void test14_5_4s7_UsingClassTemplate() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("namespace N { \n"); //$NON-NLS-1$ - buffer.append(" template class A { }; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - buffer.append("using N::A; \n"); //$NON-NLS-1$ - buffer.append("namespace N { \n"); //$NON-NLS-1$ - buffer.append(" template class A { }; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - buffer.append("A a; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(3).resolveBinding(); ICPPClassTemplatePartialSpecialization A2 = (ICPPClassTemplatePartialSpecialization) col.getName(9).resolveBinding(); - + ICPPClassType A3 = (ICPPClassType) col.getName(13).resolveBinding(); assertTrue( A3 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A3).getTemplateDefinition(), A2 ); - + ICPPClassTemplate A4 = (ICPPClassTemplate) col.getName(14).resolveBinding(); assertSame( A4, A1 ); } - + + // template class A { + // int x; + // }; + // template class A { + // char x; + // }; + // template class V> class C { + // V y; + // V z; + // }; + // void f() { + // C c; + // c.y.x; c.z.x; + // } public void testTemplateTemplateParameter() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" int x; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" char x; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template class V> class C { \n"); //$NON-NLS-1$ - buffer.append(" V y; \n"); //$NON-NLS-1$ - buffer.append(" V z; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" C c; \n"); //$NON-NLS-1$ - buffer.append(" c.y.x; c.z.x; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPField x1 = (ICPPField) col.getName(2).resolveBinding(); ICPPClassTemplatePartialSpecialization A2 = (ICPPClassTemplatePartialSpecialization) col.getName(4).resolveBinding(); ICPPField x2 = (ICPPField) col.getName(7).resolveBinding(); - + ICPPClassTemplate C = (ICPPClassTemplate) col.getName(10).resolveBinding(); ICPPField y = (ICPPField) col.getName(13).resolveBinding(); ICPPField z = (ICPPField) col.getName(16).resolveBinding(); - + ICPPClassType C1 = (ICPPClassType) col.getName(18).resolveBinding(); assertTrue( C1 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)C1).getTemplateDefinition(), C ); - + ICPPField y2 = (ICPPField) col.getName(23).resolveBinding(); assertTrue( y2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)y2).getSpecializedBinding(), y ); @@ -1197,7 +1105,7 @@ public class AST2TemplateTests extends AST2BaseTest { ICPPField x3 = (ICPPField) col.getName(24).resolveBinding(); assertTrue( x3 instanceof ICPPSpecialization ); assertEquals( ((ICPPSpecialization)x3).getSpecializedBinding(), x1 ); - + ICPPField z2 = (ICPPField) col.getName(26).resolveBinding(); assertTrue( z2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)z2).getSpecializedBinding(), z ); @@ -1208,187 +1116,177 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue( x4 instanceof ICPPSpecialization ); assertEquals( ((ICPPSpecialization)x4).getSpecializedBinding(), x2 ); } + + // template class A { + // typedef T _T; + // _T t; + // }; + // void f() { + // A a; + // a.t; + // } public void testNestedTypeSpecializations() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" typedef T _T; \n"); //$NON-NLS-1$ - buffer.append(" _T t; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" A a; \n"); //$NON-NLS-1$ - buffer.append(" a.t; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ITypedef _T = (ITypedef) col.getName(3).resolveBinding(); assertSame( _T.getType(), T ); - + ICPPField t = (ICPPField) col.getName(5).resolveBinding(); assertSame( t.getType(), _T ); - + ICPPField t2 = (ICPPField) col.getName(11).resolveBinding(); assertTrue( t2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)t2).getSpecializedBinding(), t ); - + IType type = t2.getType(); assertTrue( type instanceof ITypedef ); assertTrue( type instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)type).getSpecializedBinding(), _T ); - + type = ((ITypedef)type).getType(); assertTrue( type instanceof IBasicType ); assertEquals( ((IBasicType)type).getType(), IBasicType.t_int ); } - + + // template class A { + // class B { T t; }; + // B b; + // }; + // void f() { + // A a; + // a.b.t; + // } public void _testNestedClassTypeSpecializations() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" class B { T t; }; \n"); //$NON-NLS-1$ - buffer.append(" B b; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" A a; \n"); //$NON-NLS-1$ - buffer.append(" a.b.t; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding(); ICPPField t = (ICPPField) col.getName(4).resolveBinding(); assertSame( t.getType(), T ); ICPPField b = (ICPPField) col.getName(6).resolveBinding(); assertSame( b.getType(), B ); - + ICPPField b2 = (ICPPField) col.getName(12).resolveBinding(); ICPPField t2 = (ICPPField) col.getName(13).resolveBinding(); - + assertTrue( b2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)b2).getSpecializedBinding(), b ); - + IType type = b2.getType(); assertTrue( type instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)type).getSpecializedBinding(), B ); - + assertTrue( t2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)t2).getSpecializedBinding(), t ); assertTrue( t2.getType() instanceof IBasicType ); assertEquals( ((IBasicType)t2.getType()).getType(), IBasicType.t_int ); } - + + // template class A { + // typedef typename T::X _xx; + // _xx s; + // }; + // class B {}; + // template < class T > class C { + // typedef T X; + // }; + // void f() { + // A< C > a; a.s; + // }; public void testTemplateParameterQualifiedType_1() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" typedef typename T::X _xx; \n"); //$NON-NLS-1$ - buffer.append(" _xx s; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("class B {}; \n"); //$NON-NLS-1$ - buffer.append("template < class T > class C { \n"); //$NON-NLS-1$ - buffer.append(" typedef T X; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" A< C > a; a.s; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateTypeParameter T = (ICPPTemplateTypeParameter) col.getName(0).resolveBinding(); ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); - + IBinding T1 = col.getName(3).resolveBinding(); assertSame( T1, T ); - + ICPPClassType X = (ICPPClassType) col.getName(4).resolveBinding(); - + ITypedef _xx = (ITypedef) col.getName(5).resolveBinding(); - + IBinding _xx2 = col.getName(6).resolveBinding(); assertSame( _xx, _xx2 ); assertSame( _xx.getType(), X ); - + ICPPField s = (ICPPField) col.getName(7).resolveBinding(); - + ICPPClassType B = (ICPPClassType) col.getName(8).resolveBinding(); ITypedef X2 = (ITypedef) col.getName(12).resolveBinding(); - + ICPPClassType Acb = (ICPPClassType) col.getName(14).resolveBinding(); assertTrue( Acb instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)Acb).getTemplateDefinition(), A ); - + ICPPField s2 = (ICPPField) col.getName(21).resolveBinding(); assertTrue( s2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)s2).getSpecializedBinding(), s ); - + IType t = s2.getType(); -// assertTrue( t instanceof ITypedef ); -// assertTrue( t instanceof ICPPSpecialization ); -// assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), _xx ); - + // assertTrue( t instanceof ITypedef ); + // assertTrue( t instanceof ICPPSpecialization ); + // assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), _xx ); + t = ((ITypedef)t).getType(); assertTrue( t instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), X2 ); - + t = ((ITypedef)t).getType(); assertSame( t, B ); } - + + // template class A { + // A a; + // void f(); + // }; + // template void A::f(){ + // U u; + // } public void testTemplateScopes() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" A a; \n"); //$NON-NLS-1$ - buffer.append(" void f(); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template void A::f(){ \n"); //$NON-NLS-1$ - buffer.append(" U u; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPClassType A2 = (ICPPClassType) col.getName(2).resolveBinding(); - + ICPPTemplateParameter U = (ICPPTemplateParameter) col.getName(7).resolveBinding(); assertSame( U, T ); ICPPClassType A3 = (ICPPClassType) col.getName(9).resolveBinding(); assertTrue( A3 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance) A3).getTemplateDefinition(), A ); assertSame( A2, A3 ); - - + + ICPPTemplateParameter U2 = (ICPPTemplateParameter) col.getName(13).resolveBinding(); assertSame( U, U2 ); assertSame( T, U ); } - + + // class A { + // template < class T > void f(T); + // }; + // template void A::f<>(U){} public void testTemplateScopes_2() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("class A { \n"); //$NON-NLS-1$ - buffer.append(" template < class T > void f(T); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template void A::f<>(U){} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding(); ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(1).resolveBinding(); ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(2).resolveBinding(); ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(3).resolveBinding(); assertSame( T, T2 ); - + ICPPTemplateParameter U = (ICPPTemplateParameter) col.getName(5).resolveBinding(); assertSame( T, U ); ICPPClassType A2 = (ICPPClassType) col.getName(7).resolveBinding(); @@ -1396,53 +1294,51 @@ public class AST2TemplateTests extends AST2BaseTest { ICPPMethod f2 = (ICPPMethod) col.getName(8).resolveBinding(); IBinding U2 = col.getName(10).resolveBinding(); assertSame( U, U2 ); - + assertTrue( f2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)f2).getSpecializedBinding(), f1 ); } - + + // template struct A { + // void f(T); + // template void g(T,X); + // void h(T) { } + // }; + // template<> void A::f(int); + // template template void A::g(T,X) { } + // template<> template void A::g(int,X); + // template<> template<> void A::g(int,char); + // template<> template<> void A::g(int,char); + // template<> void A::h(int) { } public void test14_7_3s16() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template struct A { \n"); //$NON-NLS-1$ - buffer.append(" void f(T); \n"); //$NON-NLS-1$ - buffer.append(" template void g(T,X); \n"); //$NON-NLS-1$ - buffer.append(" void h(T) { } \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template<> void A::f(int); \n"); //$NON-NLS-1$ - buffer.append("template template void A::g(T,X) { } \n"); //$NON-NLS-1$ - buffer.append("template<> template void A::g(int,X); \n"); //$NON-NLS-1$ - buffer.append("template<> template<> void A::g(int,char); \n"); //$NON-NLS-1$ - buffer.append("template<> template<> void A::g(int,char); \n"); //$NON-NLS-1$ - buffer.append("template<> void A::h(int) { } \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPClassType A = (ICPPClassType) col.getName(1).resolveBinding(); ICPPMethod f = (ICPPMethod) col.getName(2).resolveBinding(); ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(3).resolveBinding(); assertSame( T, T2 ); - + ICPPTemplateParameter X = (ICPPTemplateParameter) col.getName(5).resolveBinding(); ICPPFunctionTemplate g = (ICPPFunctionTemplate) col.getName(6).resolveBinding(); ICPPTemplateParameter T3 = (ICPPTemplateParameter) col.getName(7).resolveBinding(); assertSame( T, T3 ); ICPPTemplateParameter X2 = (ICPPTemplateParameter) col.getName(9).resolveBinding(); assertSame( X, X2 ); - + ICPPMethod h = (ICPPMethod) col.getName(11).resolveBinding(); ICPPTemplateParameter T4 = (ICPPTemplateParameter) col.getName(12).resolveBinding(); assertSame( T, T4 ); - + ICPPClassType A2 = (ICPPClassType) col.getName(15).resolveBinding(); assertTrue( A2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A2).getTemplateDefinition(), A ); ICPPMethod f2 = (ICPPMethod) col.getName(17).resolveBinding(); assertTrue( f2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)f2).getSpecializedBinding(), f ); - + ICPPTemplateParameter TR = (ICPPTemplateParameter) col.getName(19).resolveBinding(); assertSame( T, TR ); ICPPTemplateParameter XR = (ICPPTemplateParameter) col.getName(20).resolveBinding(); @@ -1451,578 +1347,536 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue( A3 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A3).getTemplateDefinition(), A ); assertNotSame( A2, A3 ); - + ICPPMethod g2 = (ICPPMethod) col.getName(25).resolveBinding(); assertSame( g2, g ); TR = (ICPPTemplateParameter) col.getName(26).resolveBinding(); assertSame( T, TR ); XR = (ICPPTemplateParameter) col.getName(28).resolveBinding(); assertSame( X, XR ); - + assertSame( col.getName(32).resolveBinding(), A2 ); assertSame( col.getName(39).resolveBinding(), A2 ); assertSame( col.getName(45).resolveBinding(), A2 ); assertSame( col.getName(52).resolveBinding(), A2 ); - + ICPPMethod h2 = (ICPPMethod) col.getName(54).resolveBinding(); assertTrue( h2 instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)h2).getSpecializedBinding(), h ); } - + + // namespace N { + // int C; + // template class B { + // void f(T); + // }; + // } + // template void N::B::f(C) { + // C b; // C is the template parameter, not N::C + // } public void test14_6_1s6() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("namespace N { \n"); //$NON-NLS-1$ - buffer.append(" int C; \n"); //$NON-NLS-1$ - buffer.append(" template class B { \n"); //$NON-NLS-1$ - buffer.append(" void f(T); \n"); //$NON-NLS-1$ - buffer.append(" }; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - buffer.append("template void N::B::f(C) { \n"); //$NON-NLS-1$ - buffer.append(" C b; // C is the template parameter, not N::C \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(2).resolveBinding(); ICPPClassTemplate B = (ICPPClassTemplate) col.getName(3).resolveBinding(); ICPPMethod f = (ICPPMethod) col.getName(4).resolveBinding(); ICPPTemplateParameter TR = (ICPPTemplateParameter) col.getName(5).resolveBinding(); assertSame( T, TR ); - + ICPPTemplateParameter C = (ICPPTemplateParameter) col.getName(7).resolveBinding(); assertSame( C, T ); - + ICPPClassType B2 = (ICPPClassType) col.getName(10).resolveBinding(); assertTrue( B2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)B2).getTemplateDefinition(), B ); - + ICPPTemplateParameter CR = (ICPPTemplateParameter) col.getName(12).resolveBinding(); assertSame( CR, T ); - + ICPPMethod f2 = (ICPPMethod) col.getName(13).resolveBinding(); assertSame( f2, f ); - + CR = (ICPPTemplateParameter) col.getName(14).resolveBinding(); assertSame( CR, T ); } - + + // template class Array {}; + // template void sort( Array & ); + // template void sort<>( Array & ); public void testBug90689_ExplicitInstantiation() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class Array {}; \n"); //$NON-NLS-1$ - buffer.append("template void sort( Array & ); \n"); //$NON-NLS-1$ - buffer.append("template void sort<>( Array & ); \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - - ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); - ICPPFunctionTemplate s = (ICPPFunctionTemplate) col.getName(3).resolveBinding(); - - ICPPClassType A2 = (ICPPClassType) col.getName(4).resolveBinding(); - assertTrue( A2 instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)A2).getTemplateDefinition(), A ); - - ICPPFunction s2 = (ICPPFunction) col.getName(8).resolveBinding(); - assertTrue( s2 instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)s2).getTemplateDefinition(), s ); - - ICPPClassType A3 = (ICPPClassType) col.getName(10).resolveBinding(); - assertTrue( A3 instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)A3).getTemplateDefinition(), A ); - assertNotSame( A2, A3 ); + + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding(); + ICPPFunctionTemplate s = (ICPPFunctionTemplate) col.getName(3).resolveBinding(); + + ICPPClassType A2 = (ICPPClassType) col.getName(4).resolveBinding(); + assertTrue( A2 instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)A2).getTemplateDefinition(), A ); + + ICPPFunction s2 = (ICPPFunction) col.getName(8).resolveBinding(); + assertTrue( s2 instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)s2).getTemplateDefinition(), s ); + + ICPPClassType A3 = (ICPPClassType) col.getName(10).resolveBinding(); + assertTrue( A3 instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)A3).getTemplateDefinition(), A ); + assertNotSame( A2, A3 ); } - + + // template class Array { }; + // template class Array; + // template void sort(Array& v) { } + // template void sort(Array&); // argument is deduced here public void test14_7_2s2_ExplicitInstantiation() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class Array { }; \n"); //$NON-NLS-1$ - buffer.append("template class Array; \n"); //$NON-NLS-1$ - buffer.append("template void sort(Array& v) { } \n"); //$NON-NLS-1$ - buffer.append("template void sort(Array&); // argument is deduced here \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding(); ICPPClassType A2 = (ICPPClassType) col.getName(2).resolveBinding(); assertTrue( A2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A2).getTemplateDefinition(), A1 ); - + ICPPFunctionTemplate s1 = (ICPPFunctionTemplate) col.getName(5).resolveBinding(); ICPPFunction s2 = (ICPPFunction) col.getName(10).resolveBinding(); assertTrue( s2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)s2).getTemplateDefinition(), s1 ); - + ICPPClassType A3 = (ICPPClassType) col.getName(11).resolveBinding(); assertSame( A2, A3 ); } - + + // template class A { + // A* p; + // void f() { this; } + // }; public void testBug74204() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" A* p; \n"); //$NON-NLS-1$ - buffer.append(" void f() { this; } \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + IField p = (IField) col.getName(5).resolveBinding(); - + IASTName f = col.getName(6); IASTFunctionDefinition fdef = (IASTFunctionDefinition) f.getParent().getParent(); IASTExpressionStatement statement = (IASTExpressionStatement) ((IASTCompoundStatement)fdef.getBody()).getStatements()[0]; IType type = CPPVisitor.getExpressionType( statement.getExpression() ); - + assertTrue( type.isSameType( p.getType() ) ); } - + + // template void f( T ); + // template void g( T t ){ + // f( t ); + // } public void testDeferredFunctionTemplates() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template void f( T ); \n"); //$NON-NLS-1$ - buffer.append("template void g( T t ){ \n"); //$NON-NLS-1$ - buffer.append(" f( t ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunction f2 = (ICPPFunction) col.getName(8).resolveBinding(); assertTrue( f2 instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f ); } - + + // template < class T > class A {}; + // template < class T > class B { + // void init( A * ); + // }; + // template < class T > class C : public B { + // C( A * a ) { + // init( a ); + // } + // }; public void testRelaxationForTemplateInheritance() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > class A {}; \n"); //$NON-NLS-1$ - buffer.append("template < class T > class B { \n"); //$NON-NLS-1$ - buffer.append(" void init( A * ); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template < class T > class C : public B { \n"); //$NON-NLS-1$ - buffer.append(" C( A * a ) { \n"); //$NON-NLS-1$ - buffer.append(" init( a ); \n"); //$NON-NLS-1$ - buffer.append(" } \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPMethod init = (ICPPMethod) col.getName(4).resolveBinding(); ICPPSpecialization b0 = (ICPPSpecialization) col.getName(19).resolveBinding(); assertSame(init, b0.getSpecializedBinding()); } - + + // template class iter { + // Tp operator -> () const; + // Tr operator [] (int) const; + // }; + // template class list { + // typedef iter< T*, T& > iterator; + // iterator begin(); + // iterator end(); + // }; + // class Bar { public: int foo; }; + // void f() { + // list bar; + // for( list::iterator i = bar.begin(); i != bar.end(); ++i ){ + // i->foo; i[0].foo; + // } + // } public void testBug91707() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class iter { \n"); //$NON-NLS-1$ - buffer.append(" Tp operator -> () const; \n"); //$NON-NLS-1$ - buffer.append(" Tr operator [] (int) const; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template class list { \n"); //$NON-NLS-1$ - buffer.append(" typedef iter< T*, T& > iterator; \n"); //$NON-NLS-1$ - buffer.append(" iterator begin(); \n"); //$NON-NLS-1$ - buffer.append(" iterator end(); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("class Bar { public: int foo; }; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" list bar; \n"); //$NON-NLS-1$ - buffer.append(" for( list::iterator i = bar.begin(); i != bar.end(); ++i ){ \n"); //$NON-NLS-1$ - buffer.append(" i->foo; i[0].foo; \n"); //$NON-NLS-1$ - buffer.append(" } \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPMethod begin = (ICPPMethod) col.getName(16).resolveBinding(); ICPPMethod end = (ICPPMethod) col.getName(18).resolveBinding(); - + ICPPField foo = (ICPPField) col.getName(20).resolveBinding(); - + IBinding r = col.getName(33).resolveBinding(); assertTrue( r instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)r).getSpecializedBinding(), begin ); - + r = col.getName(36).resolveBinding(); assertTrue( r instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)r).getSpecializedBinding(), end ); - + assertSame( foo, col.getName(39).resolveBinding() ); assertSame( foo, col.getName(41).resolveBinding() ); } - + + // class B { int i; }; + // template class A { + // typedef T* _T; + // }; + // void f(){ + // A::_T t; + // (*t).i; + // } public void testBug98961() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("class B { int i; }; \n"); //$NON-NLS-1$ - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" typedef T* _T; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f(){ \n"); //$NON-NLS-1$ - buffer.append(" A::_T t; \n"); //$NON-NLS-1$ - buffer.append(" (*t).i; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPClassType B = (ICPPClassType) col.getName(0).resolveBinding(); ICPPField i = (ICPPField) col.getName(1).resolveBinding(); ITypedef _T = (ITypedef) col.getName(5).resolveBinding(); ICPPVariable t = (ICPPVariable) col.getName(12).resolveBinding(); - + IType type = t.getType(); assertTrue( type instanceof ICPPSpecialization ); assertSame( ((ICPPSpecialization)type).getSpecializedBinding(), _T ); assertSame( ((IPointerType)((ITypedef)type).getType()).getType(), B ); assertSame( i, col.getName(14).resolveBinding() ); } - + + // class A { + // template void f( T ) { + // begin(); + // } + // void begin(); + // }; public void testBug98784() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("class A { \n"); //$NON-NLS-1$ - buffer.append(" template void f( T ) { \n"); //$NON-NLS-1$ - buffer.append(" begin(); \n"); //$NON-NLS-1$ - buffer.append(" } \n"); //$NON-NLS-1$ - buffer.append(" void begin(); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + assertSame( col.getName(5).resolveBinding(), col.getName(6).resolveBinding() ); } - + + // template class A { + // A( T t ); + // }; + // void f( A a ); + // void m(){ + // f( A(1) ); + // } public void testBug99254() throws Exception{ - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { \n"); //$NON-NLS-1$ - buffer.append(" A( T t ); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f( A a ); \n"); //$NON-NLS-1$ - buffer.append("void m(){ \n"); //$NON-NLS-1$ - buffer.append(" f( A(1) ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPConstructor ctor = (ICPPConstructor) col.getName(2).resolveBinding(); ICPPFunction f = (ICPPFunction) col.getName(5).resolveBinding(); - + ICPPSpecialization spec = (ICPPSpecialization) col.getName(11).resolveBinding(); assertSame( spec.getSpecializedBinding(), ctor ); - + assertSame( f, col.getName(10).resolveBinding() ); } - + + // namespace core { + // template class A { + // A( T x, T y ); + // }; + // } + // class B { + // int add(const core::A &rect ); + // }; + // void f( B* b ){ + // b->add( core::A(10, 2) ); + // } public void testBug99254_2() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("namespace core { \n"); //$NON-NLS-1$ - buffer.append(" template class A { \n"); //$NON-NLS-1$ - buffer.append(" A( T x, T y ); \n"); //$NON-NLS-1$ - buffer.append(" }; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - buffer.append("class B { \n"); //$NON-NLS-1$ - buffer.append(" int add(const core::A &rect ); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f( B* b ){ \n"); //$NON-NLS-1$ - buffer.append(" b->add( core::A(10, 2) ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPConstructor ctor = (ICPPConstructor) col.getName(3).resolveBinding(); ICPPMethod add = (ICPPMethod) col.getName(9).resolveBinding(); - + ICPPSpecialization spec = (ICPPSpecialization) col.getName(20).resolveBinding(); assertSame( spec.getSpecializedBinding(), ctor ); - + assertSame( add, col.getName(19).resolveBinding() ); } - + + // template class A { A( T ); }; + // typedef signed int s32; + // class B { + // int add(const A &rect ); + // }; + // void f( B* b ){ + // b->add( A(10) ); + // } public void testBug99254_3() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A { A( T ); }; \n"); //$NON-NLS-1$ - buffer.append("typedef signed int s32; \n"); //$NON-NLS-1$ - buffer.append("class B { \n"); //$NON-NLS-1$ - buffer.append(" int add(const A &rect ); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void f( B* b ){ \n"); //$NON-NLS-1$ - buffer.append(" b->add( A(10) ); \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPConstructor ctor = (ICPPConstructor) col.getName(2).resolveBinding(); ICPPMethod add = (ICPPMethod) col.getName(7).resolveBinding(); - + ICPPSpecialization spec = (ICPPSpecialization) col.getName(17).resolveBinding(); assertSame( spec.getSpecializedBinding(), ctor ); - + assertSame( add, col.getName(16).resolveBinding() ); } - + public void testBug98666() throws Exception { IASTTranslationUnit tu = parse( "A::template B b;", ParserLanguage.CPP ); //$NON-NLS-1$ CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPASTQualifiedName qn = (ICPPASTQualifiedName) col.getName(0); IASTName [] ns = qn.getNames(); assertTrue( ns[1] instanceof ICPPASTTemplateId ); assertEquals( ((ICPPASTTemplateId)ns[1]).toString(), "B" ); //$NON-NLS-1$ } - + + // template struct A{ + // class C { + // template struct B {}; + // }; + // }; + // template template + // struct A::C::B{}; + // A::C::B ab; public void testBug90678() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template struct A{ \n"); //$NON-NLS-1$ - buffer.append(" class C { \n"); //$NON-NLS-1$ - buffer.append(" template struct B {}; \n"); //$NON-NLS-1$ - buffer.append(" }; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template template \n"); //$NON-NLS-1$ - buffer.append("struct A::C::B{}; \n"); //$NON-NLS-1$ - buffer.append("A::C::B ab; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(3).resolveBinding(); - + ICPPClassTemplate B = (ICPPClassTemplate) col.getName(4).resolveBinding(); - + assertSame( T, col.getName(5).resolveBinding() ); assertSame( T2, col.getName(6).resolveBinding() ); assertSame( T, col.getName(10).resolveBinding() ); assertSame( T2, col.getName(14).resolveBinding() ); - + ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) col.getName(12).resolveBinding(); assertSame( spec.getPrimaryClassTemplate(), B ); - + ICPPClassType BI = (ICPPClassType) col.getName(19).resolveBinding(); assertTrue( BI instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)BI).getSpecializedBinding(), spec ); } - + + // template int f(T); // #1 + // int f(int); // #2 + // int k = f(1); // uses #2 + // int l = f<>(1); // uses #1 public void testBug95208() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append( "template int f(T); // #1\n"); //$NON-NLS-1$ - buffer.append( "int f(int); // #2\n"); //$NON-NLS-1$ - buffer.append( "int k = f(1); // uses #2\n"); //$NON-NLS-1$ - buffer.append( "int l = f<>(1); // uses #1\n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + String content= getAboveComment(); + IASTTranslationUnit tu = parse(content, ParserLanguage.CPP ); CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - - ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); - ICPPFunction f2 = (ICPPFunction) col.getName(4).resolveBinding(); - - assertSame( f2, col.getName(7).resolveBinding() ); - + tu.accept(col); + + ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); + ICPPFunction f2 = (ICPPFunction) col.getName(4).resolveBinding(); + + assertSame( f2, col.getName(7).resolveBinding() ); + IBinding b = col.getName(9).resolveBinding(); // resolve the binding of the ICPPASTTemplateId first assertTrue( b instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)b).getSpecializedBinding(), f1 ); assertSame( f1, col.getName(10).resolveBinding() ); - - - tu = parse( buffer.toString(),ParserLanguage.CPP ); - col = new CPPNameCollector(); - tu.accept(col); - - f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); - assertSame( f1, col.getName(10).resolveBinding() ); + + + tu = parse(content,ParserLanguage.CPP ); + col = new CPPNameCollector(); + tu.accept(col); + + f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); + assertSame( f1, col.getName(10).resolveBinding() ); } - - public void testBug103578() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A {}; \n"); //$NON-NLS-1$ - buffer.append("int f() { \n"); //$NON-NLS-1$ - buffer.append(" const int local = 10; \n"); //$NON-NLS-1$ - buffer.append(" A broken; \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - ICPPClassTemplate A = (ICPPClassTemplate) col.getName(2).resolveBinding(); - IVariable local = (IVariable) col.getName(4).resolveBinding(); - - ICPPClassType a = (ICPPClassType) col.getName(5).resolveBinding(); - assertTrue( a instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)a).getTemplateDefinition(), A ); - assertSame( local, col.getName(7).resolveBinding() ); - } - - public void testBug103715() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template class A : public T {}; \n"); //$NON-NLS-1$ - buffer.append("class B { int base; }; \n"); //$NON-NLS-1$ - buffer.append("void f() { \n"); //$NON-NLS-1$ - buffer.append(" A< B > a; \n"); //$NON-NLS-1$ - buffer.append(" a.base; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - ICPPField base = (ICPPField) col.getName(4).resolveBinding(); - assertSame( base, col.getName(11).resolveBinding() ); - - ICPPClassType B = (ICPPClassType) col.getName(3).resolveBinding(); - ICPPClassType A = (ICPPClassType) col.getName(6).resolveBinding(); - - ICPPBase [] bases = A.getBases(); - assertEquals( bases.length, 1 ); - assertSame( bases[0].getBaseClass(), B ); - } - - public void testBug74276() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template < class T > class complex; \n"); //$NON-NLS-1$ - buffer.append("template <> class complex ; \n"); //$NON-NLS-1$ - buffer.append("template < class T > class complex{ \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("template <> class complex< float > { \n"); //$NON-NLS-1$ - buffer.append(" void f( float ); \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - buffer.append("void complex::f(float){ \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - ICPPClassTemplate complex = (ICPPClassTemplate) col.getName(1).resolveBinding(); - ICPPClassType cspec = (ICPPClassType) col.getName(2).resolveBinding(); - assertTrue( cspec instanceof ICPPSpecialization ); - assertSame( ((ICPPSpecialization)cspec).getSpecializedBinding(), complex ); - - assertSame( complex, col.getName(5).resolveBinding() ); - assertSame( cspec, col.getName(6).resolveBinding() ); - - ICPPMethod f = (ICPPMethod) col.getName(8).resolveBinding(); - assertSame( f, col.getName(10).resolveBinding() ); - } - - public void testBug105852() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template< class T1, int q > class C {}; \n"); //$NON-NLS-1$ - buffer.append("template< class T1, class T2> class A {}; \n"); //$NON-NLS-1$ - buffer.append("template< class T1, class T2, int q1, int q2>\n"); //$NON-NLS-1$ - buffer.append("class A< C, C > {}; \n"); //$NON-NLS-1$ - buffer.append("class N {}; \n"); //$NON-NLS-1$ - buffer.append("typedef A, C > myType; \n"); //$NON-NLS-1$ - buffer.append("void m(){ \n"); //$NON-NLS-1$ - buffer.append(" myType t; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - ITypedef myType = (ITypedef) col.getName(31).resolveBinding(); - ICPPClassType A = (ICPPClassType) myType.getType(); - - ICPPSpecialization Aspec = (ICPPSpecialization) col.getName(10).resolveBinding(); - - assertTrue( A instanceof ICPPTemplateInstance ); - assertSame( ((ICPPTemplateInstance)A).getTemplateDefinition(), Aspec); - } - - public void testBug105769() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template< class T > class A : public T {}; \n"); //$NON-NLS-1$ - buffer.append("class C { public: int c; }; \n"); //$NON-NLS-1$ - buffer.append("class B : public A { }; \n"); //$NON-NLS-1$ - buffer.append("void main(){ \n"); //$NON-NLS-1$ - buffer.append(" B k; \n"); //$NON-NLS-1$ - buffer.append(" k.c; \n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - ICPPVariable c = (ICPPVariable) col.getName(13).resolveBinding(); - assertSame( c, col.getName(4).resolveBinding() ); - } - - public void testBug162230() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template< class T > class C { \n"); //$NON-NLS-1$ - buffer.append(" public: void * blah; \n"); //$NON-NLS-1$ - buffer.append(" template C(G* g) : blah(g) {} \n"); //$NON-NLS-1$ - buffer.append(" template <> C(char * c) : blah(c) {} \n"); //$NON-NLS-1$ - buffer.append(" template <> C(wchar_t * c) : blah(c) {} \n"); //$NON-NLS-1$ - buffer.append("}; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); - ICPPClassTemplate C = (ICPPClassTemplate) col.getName(1).resolveBinding(); - ICPPField blah = (ICPPField) col.getName(2).resolveBinding(); - ICPPTemplateTypeParameter G = (ICPPTemplateTypeParameter) col.getName(3).resolveBinding(); - ICPPFunctionTemplate ctor = (ICPPFunctionTemplate) col.getName(4).resolveBinding(); - - assertSame(G, col.getName(5).resolveBinding()); - ICPPParameter g = (ICPPParameter) col.getName(6).resolveBinding(); - assertSame(blah, col.getName(7).resolveBinding()); - assertSame(g, col.getName(8).resolveBinding()); - - ICPPSpecialization spec = (ICPPSpecialization) col.getName(9).resolveBinding(); - assertSame(spec.getSpecializedBinding(), ctor); - - ICPPSpecialization c = (ICPPSpecialization) col.getName(10).resolveBinding(); - assertSame(c.getSpecializedBinding(), g); - - assertSame(blah, col.getName(11).resolveBinding()); - assertSame(c, col.getName(12).resolveBinding()); - - ICPPSpecialization spec2 = (ICPPSpecialization) col.getName(13).resolveBinding(); - assertSame(spec.getSpecializedBinding(), ctor); - - ICPPSpecialization c2 = (ICPPSpecialization) col.getName(14).resolveBinding(); - assertSame(c2.getSpecializedBinding(), g); - - assertSame(blah, col.getName(15).resolveBinding()); - assertSame(c2, col.getName(16).resolveBinding()); - } - - public void testBug169628() throws Exception { - StringBuffer buffer = new StringBuffer(); - buffer.append("template< class T > class C {}; \n"); //$NON-NLS-1$ - buffer.append("typedef struct C CInt; \n"); //$NON-NLS-1$ - - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - assertTrue( col.getName(2).resolveBinding() instanceof ICPPSpecialization ); - } - - // // Brian W.'s example from bugzilla#167098 + + // template class A {}; + // int f() { + // const int local = 10; + // A broken; + // }; + public void testBug103578() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(2).resolveBinding(); + IVariable local = (IVariable) col.getName(4).resolveBinding(); + + ICPPClassType a = (ICPPClassType) col.getName(5).resolveBinding(); + assertTrue( a instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)a).getTemplateDefinition(), A ); + assertSame( local, col.getName(7).resolveBinding() ); + } + + // template class A : public T {}; + // class B { int base; }; + // void f() { + // A< B > a; + // a.base; + // } + public void testBug103715() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPField base = (ICPPField) col.getName(4).resolveBinding(); + assertSame( base, col.getName(11).resolveBinding() ); + + ICPPClassType B = (ICPPClassType) col.getName(3).resolveBinding(); + ICPPClassType A = (ICPPClassType) col.getName(6).resolveBinding(); + + ICPPBase [] bases = A.getBases(); + assertEquals( bases.length, 1 ); + assertSame( bases[0].getBaseClass(), B ); + } + + // template < class T > class complex; + // template <> class complex ; + // template < class T > class complex{ + // }; + // template <> class complex< float > { + // void f( float ); + // }; + // void complex::f(float){ + // } + public void testBug74276() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPClassTemplate complex = (ICPPClassTemplate) col.getName(1).resolveBinding(); + ICPPClassType cspec = (ICPPClassType) col.getName(2).resolveBinding(); + assertTrue( cspec instanceof ICPPSpecialization ); + assertSame( ((ICPPSpecialization)cspec).getSpecializedBinding(), complex ); + + assertSame( complex, col.getName(5).resolveBinding() ); + assertSame( cspec, col.getName(6).resolveBinding() ); + + ICPPMethod f = (ICPPMethod) col.getName(8).resolveBinding(); + assertSame( f, col.getName(10).resolveBinding() ); + } + + // template< class T1, int q > class C {}; + // template< class T1, class T2> class A {}; + // template< class T1, class T2, int q1, int q2> + // class A< C, C > {}; + // class N {}; + // typedef A, C > myType; + // void m(){ + // myType t; + // } + public void testBug105852() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ITypedef myType = (ITypedef) col.getName(31).resolveBinding(); + ICPPClassType A = (ICPPClassType) myType.getType(); + + ICPPSpecialization Aspec = (ICPPSpecialization) col.getName(10).resolveBinding(); + + assertTrue( A instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)A).getTemplateDefinition(), Aspec); + } + + // template< class T > class A : public T {}; + // class C { public: int c; }; + // class B : public A { }; + // void main(){ + // B k; + // k.c; + // } + public void testBug105769() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPVariable c = (ICPPVariable) col.getName(13).resolveBinding(); + assertSame( c, col.getName(4).resolveBinding() ); + } + + // template< class T > class C { + // public: void * blah; + // template C(G* g) : blah(g) {} + // template <> C(char * c) : blah(c) {} + // template <> C(wchar_t * c) : blah(c) {} + // }; + public void testBug162230() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); + ICPPClassTemplate C = (ICPPClassTemplate) col.getName(1).resolveBinding(); + ICPPField blah = (ICPPField) col.getName(2).resolveBinding(); + ICPPTemplateTypeParameter G = (ICPPTemplateTypeParameter) col.getName(3).resolveBinding(); + ICPPFunctionTemplate ctor = (ICPPFunctionTemplate) col.getName(4).resolveBinding(); + + assertSame(G, col.getName(5).resolveBinding()); + ICPPParameter g = (ICPPParameter) col.getName(6).resolveBinding(); + assertSame(blah, col.getName(7).resolveBinding()); + assertSame(g, col.getName(8).resolveBinding()); + + ICPPSpecialization spec = (ICPPSpecialization) col.getName(9).resolveBinding(); + assertSame(spec.getSpecializedBinding(), ctor); + + ICPPSpecialization c = (ICPPSpecialization) col.getName(10).resolveBinding(); + assertSame(c.getSpecializedBinding(), g); + + assertSame(blah, col.getName(11).resolveBinding()); + assertSame(c, col.getName(12).resolveBinding()); + + ICPPSpecialization spec2 = (ICPPSpecialization) col.getName(13).resolveBinding(); + assertSame(spec.getSpecializedBinding(), ctor); + + ICPPSpecialization c2 = (ICPPSpecialization) col.getName(14).resolveBinding(); + assertSame(c2.getSpecializedBinding(), g); + + assertSame(blah, col.getName(15).resolveBinding()); + assertSame(c2, col.getName(16).resolveBinding()); + } + + // template< class T > class C {}; + // typedef struct C CInt; + public void testBug169628() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + assertTrue( col.getName(2).resolveBinding() instanceof ICPPSpecialization ); + } + + // // Brian W.'s example from bugzilla#167098 // template // class D { //CPPClassTemplate // public: @@ -2043,200 +1897,194 @@ public class AST2TemplateTests extends AST2BaseTest { // // foo -> CPPMethodTemplateSpecialization // // foo -> CPPMethodInstance // } - public void testCPPConstructorTemplateSpecialization() throws Exception { - StringBuffer buffer = getContents(1)[0]; - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP, true, true ); - - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - ICPPASTTemplateId tid= (ICPPASTTemplateId) col.getName(20); - IASTName cn= col.getName(21); - assertInstance(cn.resolveBinding(), ICPPClassTemplate.class); // *D*(5, 6) - assertInstance(cn.resolveBinding(), ICPPClassType.class); // *D*(5, 6) - assertInstance(tid.resolveBinding(), ICPPTemplateInstance.class); // *D*(5, 6) - assertInstance(tid.resolveBinding(), ICPPConstructor.class); // *D*(5, 6) - - IBinding tidSpc= ((ICPPTemplateInstance)tid.resolveBinding()).getSpecializedBinding(); - assertInstance(tidSpc, ICPPConstructor.class); - assertInstance(tidSpc, ICPPSpecialization.class); - assertInstance(tidSpc, ICPPFunctionTemplate.class); - } - - // template const T& (max)(const T& lhs, const T& rhs) { - // return (lhs < rhs ? rhs : lhs); - // } - public void testNestedFuncTemplatedDeclarator_bug190241() throws Exception { - StringBuffer buffer = getContents(1)[0]; - IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP, true, true ); - - CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - IASTName name; - for (Iterator i = col.nameList.iterator(); i.hasNext();) { + public void testCPPConstructorTemplateSpecialization() throws Exception { + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP, true, true ); + + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPASTTemplateId tid= (ICPPASTTemplateId) col.getName(20); + IASTName cn= col.getName(21); + assertInstance(cn.resolveBinding(), ICPPClassTemplate.class); // *D*(5, 6) + assertInstance(cn.resolveBinding(), ICPPClassType.class); // *D*(5, 6) + assertInstance(tid.resolveBinding(), ICPPTemplateInstance.class); // *D*(5, 6) + assertInstance(tid.resolveBinding(), ICPPConstructor.class); // *D*(5, 6) + + IBinding tidSpc= ((ICPPTemplateInstance)tid.resolveBinding()).getSpecializedBinding(); + assertInstance(tidSpc, ICPPConstructor.class); + assertInstance(tidSpc, ICPPSpecialization.class); + assertInstance(tidSpc, ICPPFunctionTemplate.class); + } + + // template const T& (max)(const T& lhs, const T& rhs) { + // return (lhs < rhs ? rhs : lhs); + // } + public void testNestedFuncTemplatedDeclarator_bug190241() throws Exception { + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP, true, true ); + + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + IASTName name; + for (Iterator i = col.nameList.iterator(); i.hasNext();) { name = (IASTName) i.next(); assertFalse(name.resolveBinding() instanceof IProblemBinding); } - - name= col.nameList.get(0); - assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); - name= col.nameList.get(1); - assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); - name= col.nameList.get(2); - assertTrue(name.resolveBinding() instanceof ICPPFunction); - name= col.nameList.get(3); - assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); - name= col.nameList.get(4); - assertTrue(name.resolveBinding() instanceof IParameter); - name= col.nameList.get(5); - assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); - name= col.nameList.get(6); - assertTrue(name.resolveBinding() instanceof IParameter); - name= col.nameList.get(7); - assertTrue(name.resolveBinding() instanceof IParameter); - name= col.nameList.get(8); - assertTrue(name.resolveBinding() instanceof IParameter); - name= col.nameList.get(9); - assertTrue(name.resolveBinding() instanceof IParameter); - name= col.nameList.get(10); - assertTrue(name.resolveBinding() instanceof IParameter); - } - - // template - // class A { - // public: - // typedef TpA ta; - // }; + + name= col.nameList.get(0); + assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); + name= col.nameList.get(1); + assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); + name= col.nameList.get(2); + assertTrue(name.resolveBinding() instanceof ICPPFunction); + name= col.nameList.get(3); + assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); + name= col.nameList.get(4); + assertTrue(name.resolveBinding() instanceof IParameter); + name= col.nameList.get(5); + assertTrue(name.resolveBinding() instanceof ICPPTemplateParameter); + name= col.nameList.get(6); + assertTrue(name.resolveBinding() instanceof IParameter); + name= col.nameList.get(7); + assertTrue(name.resolveBinding() instanceof IParameter); + name= col.nameList.get(8); + assertTrue(name.resolveBinding() instanceof IParameter); + name= col.nameList.get(9); + assertTrue(name.resolveBinding() instanceof IParameter); + name= col.nameList.get(10); + assertTrue(name.resolveBinding() instanceof IParameter); + } + + // template + // class A { + // public: + // typedef TpA ta; + // }; // - // template - // class B { - // public: - // typedef typename A::ta tb; - // }; - // - // void f(B::tb r) {} - public void testTemplateTypedef_214447() throws Exception { - StringBuffer buffer = getContents(1)[0]; - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true); - - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - for (IASTName name : col.nameList) { - if ("r".equals(String.valueOf(name))) { - IBinding b0 = name.resolveBinding(); - IType type = ((ICPPVariable) b0).getType(); - type = getUltimateType(type, false); - assertInstance(type, IBasicType.class); + // template + // class B { + // public: + // typedef typename A::ta tb; + // }; + // + // void f(B::tb r) {} + public void testTemplateTypedef_214447() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true); + + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + for (IASTName name : col.nameList) { + if ("r".equals(String.valueOf(name))) { + IBinding b0 = name.resolveBinding(); + IType type = ((ICPPVariable) b0).getType(); + type = getUltimateType(type, false); + assertInstance(type, IBasicType.class); assertEquals("int", ASTTypeUtil.getType(type)); - } + } } - } - - // template - // class Allocator { - // public: - // typedef _TpAllocator& alloc_reference; - // template - // struct rebind { - // typedef Allocator<_TpRebind> other; - // }; - // }; - // - // template > - // class Vec { - // public: - // typedef typename _Alloc::template rebind<_Tp>::other::alloc_reference reference; - // }; - // - // void f(Vec::reference r) {} - public void testRebindPattern_214447_1() throws Exception { - StringBuffer buffer = getContents(1)[0]; - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true); - - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - for (IASTName name : col.nameList) { - if ("r".equals(String.valueOf(name))) { - IBinding b0 = name.resolveBinding(); - IType type = ((ICPPVariable) b0).getType(); - type = getUltimateType(type, false); - assertInstance(type, IBasicType.class); + } + + // template + // class Allocator { + // public: + // typedef _TpAllocator& alloc_reference; + // template + // struct rebind { + // typedef Allocator<_TpRebind> other; + // }; + // }; + // + // template > + // class Vec { + // public: + // typedef typename _Alloc::template rebind<_Tp>::other::alloc_reference reference; + // }; + // + // void f(Vec::reference r) {} + public void testRebindPattern_214447_1() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true); + + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + for (IASTName name : col.nameList) { + if ("r".equals(String.valueOf(name))) { + IBinding b0 = name.resolveBinding(); + IType type = ((ICPPVariable) b0).getType(); + type = getUltimateType(type, false); + assertInstance(type, IBasicType.class); assertEquals("int", ASTTypeUtil.getType(type)); - } + } } - } - - // template - // class Allocator { - // public: - // typedef _TpAllocator& alloc_reference; - // template - // struct rebind { - // typedef Allocator<_TpRebind> other; - // }; - // }; - // - // template - // class VecBase { - // public: - // typedef typename _AllocBase::template rebind<_TpBase>::other _Tp_alloc_type; - // }; - // - // template > - // class Vec : protected VecBase<_Tp, _Alloc> { - // public: - // typedef typename VecBase<_Tp, _Alloc>::_Tp_alloc_type::alloc_reference reference; - // }; - // - // void f(Vec::reference r) {} - public void testRebindPattern_214447_2() throws Exception { - StringBuffer buffer = getContents(1)[0]; - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true); - - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - for (IASTName name : col.nameList) { - if ("r".equals(String.valueOf(name))) { - IBinding b0 = name.resolveBinding(); - IType type = ((ICPPVariable) b0).getType(); - type = getUltimateType(type, false); - assertInstance(type, IBasicType.class); + } + + // template + // class Allocator { + // public: + // typedef _TpAllocator& alloc_reference; + // template + // struct rebind { + // typedef Allocator<_TpRebind> other; + // }; + // }; + // + // template + // class VecBase { + // public: + // typedef typename _AllocBase::template rebind<_TpBase>::other _Tp_alloc_type; + // }; + // + // template > + // class Vec : protected VecBase<_Tp, _Alloc> { + // public: + // typedef typename VecBase<_Tp, _Alloc>::_Tp_alloc_type::alloc_reference reference; + // }; + // + // void f(Vec::reference r) {} + public void testRebindPattern_214447_2() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true); + + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + for (IASTName name : col.nameList) { + if ("r".equals(String.valueOf(name))) { + IBinding b0 = name.resolveBinding(); + IType type = ((ICPPVariable) b0).getType(); + type = getUltimateType(type, false); + assertInstance(type, IBasicType.class); assertEquals("int", ASTTypeUtil.getType(type)); - } + } } - } - - // template - // class A { - // public: - // typedef _Tp a; - // }; - // - // template > - // class B { - // public: - // typedef _Tp2 b; - // }; - // - // B::b::a x; - public void testDefaultTemplateParameter() throws Exception { - StringBuffer buffer = getContents(1)[0]; - IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true); - - CPPNameCollector col = new CPPNameCollector(); - tu.accept(col); - for (IASTName name : col.nameList) { - if ("x".equals(String.valueOf(name))) { - IBinding b0 = name.resolveBinding(); - IType type = ((ICPPVariable) b0).getType(); - type = getUltimateType(type, false); - assertInstance(type, IBasicType.class); + } + + // template + // class A { + // public: + // typedef _Tp a; + // }; + // + // template > + // class B { + // public: + // typedef _Tp2 b; + // }; + // + // B::b::a x; + public void testDefaultTemplateParameter() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true); + + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + for (IASTName name : col.nameList) { + if ("x".equals(String.valueOf(name))) { + IBinding b0 = name.resolveBinding(); + IType type = ((ICPPVariable) b0).getType(); + type = getUltimateType(type, false); + assertInstance(type, IBasicType.class); assertEquals("int", ASTTypeUtil.getType(type)); - } + } } - } - + } + // class A {}; // // template class C { @@ -2255,26 +2103,26 @@ public class AST2TemplateTests extends AST2BaseTest { // foo(a); // bar(ca); // } - public void testBug214646() throws Exception { - BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); - - IBinding b0= bh.assertNonProblem("foo(a)", 3); - IBinding b1= bh.assertNonProblem("bar(ca)", 3); - - assertInstance(b0, ICPPFunction.class); - assertInstance(b1, ICPPFunction.class); - - ICPPFunction f0= (ICPPFunction) b0, f1= (ICPPFunction) b1; - assertEquals(1, f0.getParameters().length); - assertEquals(1, f1.getParameters().length); - - assertInstance(f0.getParameters()[0].getType(), ICPPClassType.class); - assertFalse(f0 instanceof ICPPTemplateInstance); - assertFalse(f0 instanceof ICPPTemplateDefinition); - assertInstance(f1.getParameters()[0].getType(), ICPPClassType.class); - assertInstance(f1.getParameters()[0].getType(), ICPPTemplateInstance.class); - } - + public void testBug214646() throws Exception { + BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); + + IBinding b0= bh.assertNonProblem("foo(a)", 3); + IBinding b1= bh.assertNonProblem("bar(ca)", 3); + + assertInstance(b0, ICPPFunction.class); + assertInstance(b1, ICPPFunction.class); + + ICPPFunction f0= (ICPPFunction) b0, f1= (ICPPFunction) b1; + assertEquals(1, f0.getParameters().length); + assertEquals(1, f1.getParameters().length); + + assertInstance(f0.getParameters()[0].getType(), ICPPClassType.class); + assertFalse(f0 instanceof ICPPTemplateInstance); + assertFalse(f0 instanceof ICPPTemplateDefinition); + assertInstance(f1.getParameters()[0].getType(), ICPPClassType.class); + assertInstance(f1.getParameters()[0].getType(), ICPPTemplateInstance.class); + } + // class A {}; // class B {}; // template @@ -2291,11 +2139,11 @@ public class AST2TemplateTests extends AST2BaseTest { // D d; // foo(d); // } - public void testUserDefinedConversions_224364() throws Exception { - BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); - ICPPFunction fn= bh.assertNonProblem("foo(d)", 3, ICPPFunction.class); - } - + public void testUserDefinedConversions_224364() throws Exception { + BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); + ICPPFunction fn= bh.assertNonProblem("foo(d)", 3, ICPPFunction.class); + } + // class B {}; // template // class C { @@ -2311,11 +2159,11 @@ public class AST2TemplateTests extends AST2BaseTest { // D d; // foo(d); // } - public void testUserDefinedConversions_224364_2() throws Exception { - BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); - ICPPFunction fn= bh.assertNonProblem("foo(d)", 3, ICPPFunction.class); - } - + public void testUserDefinedConversions_224364_2() throws Exception { + BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); + ICPPFunction fn= bh.assertNonProblem("foo(d)", 3, ICPPFunction.class); + } + // class Z {}; // template // class A { @@ -2334,11 +2182,11 @@ public class AST2TemplateTests extends AST2BaseTest { // Z foo(Z z) {return z;} // // Z z= foo(*new E()); - public void testUserDefinedConversions_224364_3() throws Exception { - BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); - ICPPFunction fn= bh.assertNonProblem("foo(*new", 3, ICPPFunction.class); - } - + public void testUserDefinedConversions_224364_3() throws Exception { + BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); + ICPPFunction fn= bh.assertNonProblem("foo(*new", 3, ICPPFunction.class); + } + // class X {}; class B {}; // template // class C { @@ -2358,8 +2206,8 @@ public class AST2TemplateTests extends AST2BaseTest { // C cx; // foo(cx); // } - public void testUserDefinedConversions_226231() throws Exception { - BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); - ICPPFunction fn= bh.assertNonProblem("foo(cx", 3, ICPPFunction.class); - } + public void testUserDefinedConversions_226231() throws Exception { + BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); + ICPPFunction fn= bh.assertNonProblem("foo(cx", 3, ICPPFunction.class); + } }