diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java index 43959774cb5..b7dfb06e0cc 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java @@ -971,17 +971,45 @@ public class CompleteParseASTTemplateTest extends CompleteParseBaseTest { public void testBug64939() throws Exception { try{ - parse( "template < class T > class A : public A< T * > {}; A a;" ).getDeclarations(); //NON-NLS-1$ + parse( "template < class T > class A : public A< T * > {}; A a;" ).getDeclarations(); //$NON-NLS-1$ assertTrue( false ); } catch ( ParserException e ){ assertTrue( e.getMessage().equals( "FAILURE" ) ); //$NON-NLS-1$ } try{ - parse( "template < class T > class A { A f(); }; A< int > a;" ).getDeclarations(); //NON-NLS-1$ + parse( "template < class T > class A { A f(); }; A< int > a;" ).getDeclarations(); //$NON-NLS-1$ assertTrue( false ); } catch ( ParserException e ){ assertTrue( e.getMessage().equals( "FAILURE" ) ); //$NON-NLS-1$ } } + + public void testBug65114() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "template < typename _Tp, typename _Alloc > class _simple_alloc {}; \n" ); //$NON-NLS-1$ + writer.write( "template < int _inst > class __malloc_alloc {}; \n" ); //$NON-NLS-1$ + writer.write( "template < typename _Tp, int __inst> \n" ); //$NON-NLS-1$ + writer.write( "struct _Alloc_traits { \n" ); //$NON-NLS-1$ + writer.write( " typedef _simple_alloc< _Tp, __malloc_alloc<__inst> > _Alloc_type; \n" ); //$NON-NLS-1$ + writer.write( "}; \n" ); //$NON-NLS-1$ + + Iterator i = parse( writer.toString() ).getDeclarations(); + + IASTTemplateDeclaration simple_alloc = (IASTTemplateDeclaration) i.next(); + IASTTemplateDeclaration malloc_alloc = (IASTTemplateDeclaration) i.next(); + IASTTemplateDeclaration alloc_traits = (IASTTemplateDeclaration) i.next(); + + IASTClassSpecifier alloc = (IASTClassSpecifier) alloc_traits.getOwnedDeclaration(); + i = alloc_traits.getTemplateParameters(); + IASTTemplateParameter _Tp = (IASTTemplateParameter) i.next(); + IASTTemplateParameter inst = (IASTTemplateParameter) i.next(); + + IASTClassSpecifier simple = (IASTClassSpecifier) simple_alloc.getOwnedDeclaration(); + IASTClassSpecifier malloc = (IASTClassSpecifier) malloc_alloc.getOwnedDeclaration(); + + assertAllReferences( 4, createTaskList( new Task( simple ), new Task( _Tp ), + new Task( malloc ), new Task( inst ) ) ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java index 1c72c3db41c..48c62127cd5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java @@ -294,5 +294,6 @@ public abstract class ASTExpression extends ASTNode implements IASTExpression if( references == null || references.isEmpty() ) return; for (int i = 0; i < references.size(); ++i) manager.returnReference( (IASTReference) references.get(i)); + references.clear(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java index 38daa26267d..a06af473423 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java @@ -156,6 +156,6 @@ public class ASTSimpleTypeSpecifier extends ASTNode implements IASTSimpleTypeSpe if( refs == null || refs.isEmpty() ) return; for( int i = 0; i < refs.size(); ++i ) referenceManager.returnReference( (ASTReference)refs.get(i)); - + refs.clear(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypeId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypeId.java index 8d27b8bb221..baad2ff9e6f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypeId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypeId.java @@ -231,7 +231,7 @@ public class ASTTypeId implements IASTTypeId if( references.isEmpty() ) return; for( int i =0; i < references.size(); ++i) manager.returnReference( (IASTReference) references.get(i)); - + references.clear(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index 765ddf4e54e..1a89a283f92 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -3450,7 +3450,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto if( refs == null || refs.isEmpty() ) return; for( int i =0; i < refs.size(); ++i) cache.returnReference((IASTReference) refs.get(i)); - + refs.clear(); } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TemplateTokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TemplateTokenDuple.java index 9071c3ad7a9..63ff6b8ecb0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TemplateTokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TemplateTokenDuple.java @@ -112,6 +112,7 @@ public class TemplateTokenDuple extends BasicTokenDuple { { IASTExpression e = (IASTExpression) argLists[i].get(j); e.freeReferences(manager); + } } }