From e9c5a2b928b363b8f9606384772770f4fdcb6033 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Wed, 9 Jun 2004 15:45:31 +0000 Subject: [PATCH] fix NPE for 65114. When returning references to the cache, we should also remove them from the list they are in, so that we never try to return them again (potentially after they had been reallocated) --- .../tests/CompleteParseASTTemplateTest.java | 32 +++++++++++++++++-- .../parser/ast/complete/ASTExpression.java | 1 + .../ast/complete/ASTSimpleTypeSpecifier.java | 2 +- .../core/parser/ast/complete/ASTTypeId.java | 2 +- .../ast/complete/CompleteParseASTFactory.java | 2 +- .../core/parser/token/TemplateTokenDuple.java | 1 + 6 files changed, 35 insertions(+), 5 deletions(-) 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); + } } }