1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

fix bug 64919 - stack overflow in symbol table

This commit is contained in:
Andrew Niefer 2004-06-01 18:58:28 +00:00
parent 424cfd2211
commit d4c76e1e98
2 changed files with 32 additions and 5 deletions

View file

@ -938,4 +938,23 @@ public class CompleteParseASTTemplateTest extends CompleteParseBaseTest {
IASTTemplateDeclaration foo = (IASTTemplateDeclaration) i.next();
}
public void testBug64919() throws Exception{
Writer writer = new StringWriter();
writer.write("class Foo{}; ");
writer.write("class Bar{}; ");
writer.write("template <class T, class U> class A {}; ");
writer.write("template < class X > class A < X, X > : public A< X, Bar> ");
writer.write("{ typedef int TYPE; }; ");
writer.write("template < class X > class A < X, Foo > : public A< X, X > ");
writer.write("{ void f ( TYPE ); }; ");
//success is no stack overflow
Iterator i = parse( writer.toString() ).getDeclarations();
IASTClassSpecifier Foo = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTClassSpecifier Bar = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTTemplateDeclaration A1 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration A2 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration A3 = (IASTTemplateDeclaration) i.next();
}
}

View file

@ -659,12 +659,20 @@ public class ParserSymbolTable {
//if the inheritanceChain already contains the parent, then that
//is circular inheritance
if( ! data.inheritanceChain.contains( parent ) ){
//is this name define in this scope?
if( parent instanceof IDeferredTemplateInstance ){
parent = ((IDeferredTemplateInstance)parent).getTemplate().getTemplatedSymbol();
} else if( parent instanceof ITemplateSymbol ){
parent = ((ITemplateSymbol)parent).getTemplatedSymbol();
if( parent instanceof IDeferredTemplateInstance || parent instanceof ITemplateSymbol ){
if( parent instanceof IDeferredTemplateInstance ){
parent = ((IDeferredTemplateInstance)parent).getTemplate().getTemplatedSymbol();
} else if( parent instanceof ITemplateSymbol ){
parent = ((ITemplateSymbol)parent).getTemplatedSymbol();
}
if( data.inheritanceChain.contains( parent ) ){
//bug 64919, might not really be circular inheritance, it just looks that way
//don't throw an exception, just ignore this parent.
continue;
}
}
//is this name define in this scope?
if( parent instanceof IDerivableContainerSymbol ){
temp = lookupInContained( data, (IDerivableContainerSymbol) parent );
} else {