From daaf6bcf2b58db5a9c9f6525d50b813e0cceb3ba Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Fri, 9 Apr 2004 20:58:13 +0000 Subject: [PATCH] fix NPE and ClassCastException encountered while parsing fix bug in handling some template member templates --- core/org.eclipse.cdt.core.tests/ChangeLog | 3 ++ .../tests/CompleteParseASTTemplateTest.java | 20 +++++++++++++ .../parser/ChangeLog-parser | 4 +++ .../core/parser/pst/TemplateEngine.java | 28 +++++++++++++++++++ .../core/parser/pst/TemplateFactory.java | 1 + .../internal/core/parser/pst/TypeInfo.java | 9 ++++-- 6 files changed, 63 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index f8dfcef74b4..153dffda301 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,6 @@ +2004-04-09 Andrew Niefer + added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.testTemplateMemberTemplateDefinition() + 2004-04-09 Andrew Niefer fixed bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=57754 added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testBug57754() 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 1bb42c923c2..73c3c9cc59f 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 @@ -735,4 +735,24 @@ public class CompleteParseASTTemplateTest extends CompleteParseBaseTest { IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next(); IASTTemplateSpecialization spec = (IASTTemplateSpecialization) i.next(); } + + public void testTemplateMemberTemplateDefinition() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "template< typename _Tp > "); + writer.write( "class list "); + writer.write( "{ "); + writer.write( " template void merge(list&, _S); "); + writer.write( "}; "); + + writer.write( "template < typename _Tp > "); + writer.write( "template < typename _S > "); + writer.write( "void list<_Tp>::merge(list<_Tp>& __x, _S __comp) "); + writer.write( "{} "); + + Iterator i = parse( writer.toString() ).getDeclarations(); + + IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next(); + IASTTemplateDeclaration temp2 = (IASTTemplateDeclaration) i.next(); + } } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index b6d8d050cde..1d5f4011ded 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog-parser +++ b/core/org.eclipse.cdt.core/parser/ChangeLog-parser @@ -1,3 +1,7 @@ +2004-04-09 Andrew Niefer + handle NPE during template argument deduction + fix bug in definitions of certain template member templates (fixes a ClassCastException encountered in ) + 2004-04-09 Andrew Niefer fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=57754 Fixed problems found after parsing iostream with discovered symbols, once 57754 was fixed: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java index a8884078529..35a753e4090 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java @@ -443,6 +443,8 @@ public final class TemplateEngine { if( p.isType( TypeInfo.t_type ) ){ symbol = p.getTypeSymbol(); ISymbol aSymbol = a.getTypeSymbol(); + if( symbol == null || ( a.isType( TypeInfo.t_type) && aSymbol == null ) ) + throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo ); if( symbol instanceof IDeferredTemplateInstance || symbol.isTemplateInstance() ){ return deduceFromTemplateTemplateArguments(map, symbol, aSymbol); } else { @@ -1273,4 +1275,30 @@ public final class TemplateEngine { } return (ITemplateSymbol) symbol.getContainingSymbol(); } + + /** + * @param instance + * @param instance2 + * @return + */ + protected static boolean deferedInstancesAreEquivalent(IDeferredTemplateInstance instance, IDeferredTemplateInstance instance2) { + if( instance.getTemplate() != instance2.getTemplate() ) + return false; + + List args = instance.getArguments(); + List args2 = instance2.getArguments(); + + if( args.size() != args2.size() ) + return false; + + Iterator iter1 = args.iterator(), iter2 = args2.iterator(); + while( iter1.hasNext() ){ + TypeInfo info1 = (TypeInfo) iter1.next(); + TypeInfo info2 = (TypeInfo) iter2.next(); + + if( ! info1.equals( info2 ) ) + return false; + } + return true; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java index 575cc59f869..6cda9fe6a4e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java @@ -18,6 +18,7 @@ import java.util.ListIterator; import java.util.Map; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; +import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.internal.core.parser.ast.complete.ASTTemplateDeclaration; import org.eclipse.cdt.internal.core.parser.ast.complete.ASTTemplateInstantiation; import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java index 85cb85c7c35..da930293290 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java @@ -492,10 +492,15 @@ public class TypeInfo { else result &= (f1.getReturnType() == f2.getReturnType()); } else if( _typeDeclaration.isType( TypeInfo.t_templateParameter ) && - type._typeDeclaration.isType( TypeInfo.t_templateParameter ) ){ + type._typeDeclaration.isType( TypeInfo.t_templateParameter ) ) + { //template parameters result &= TemplateEngine.templateParametersAreEquivalent( _typeDeclaration, type._typeDeclaration ); - } else { + } else if ( _typeDeclaration instanceof IDeferredTemplateInstance && + type._typeDeclaration instanceof IDeferredTemplateInstance ) + { + result &= TemplateEngine.deferedInstancesAreEquivalent( (IDeferredTemplateInstance) _typeDeclaration, (IDeferredTemplateInstance)type._typeDeclaration ); + }else { //otherwise, its a user defined type, need the decls the same result &= ( _typeDeclaration == type._typeDeclaration ); }