From 0454da5130b8e324b0755ae6bdf9656d0b1c1a15 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Fri, 18 Jun 2004 15:25:56 +0000 Subject: [PATCH] bug 67680 - better error handling around problems in the base clause specifier fixes class cast exception --- .../parser/tests/CompleteParseASTTest.java | 20 +++++++++++++++++++ .../cdt/internal/core/parser/Parser.java | 13 +++++++----- .../ast/complete/CompleteParseASTFactory.java | 6 ++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index f232be1ff95..7117f00aacb 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -1947,4 +1947,24 @@ public class CompleteParseASTTest extends CompleteParseBaseTest { parse( "const char * x = __FILE__;"); //$NON-NLS-1$ } + + public void testBug67680() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "template < class T> class Base {}; \n" ); + writer.write( "class Derived : public Base, Base, foo {}; \n" ); + + Iterator i = parse( writer.toString(), false ).getDeclarations(); + + IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next(); + IASTClassSpecifier base = (IASTClassSpecifier) template.getOwnedDeclaration(); + IASTClassSpecifier derived = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + + //only Base is a valid parent, Base and foo are not expected to show up in the iterator. + i = derived.getBaseClauses(); + IASTBaseSpecifier parent = (IASTBaseSpecifier) i.next(); + assertFalse( i.hasNext() ); + + assertEquals( parent.getParentClassSpecifier(), base ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index 356b73b5744..9b5da326edb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -2856,10 +2856,14 @@ public abstract class Parser extends ExpressionParser implements IParser int size = bases.size(); for( int i = 0; i < size; i++ ){ Object [] data = (Object[]) bases.get( i ); - astFactory.addBaseSpecifier( astClassSpec, - ((Boolean)data[0]).booleanValue(), - (ASTAccessVisibility) data[1], - (ITokenDuple)data[2] ); + try { + astFactory.addBaseSpecifier( astClassSpec, + ((Boolean)data[0]).booleanValue(), + (ASTAccessVisibility) data[1], + (ITokenDuple)data[2] ); + } catch (ASTSemanticException e1) { + failParse(); + } } } @@ -2872,7 +2876,6 @@ public abstract class Parser extends ExpressionParser implements IParser catch (ASTSemanticException e) { failParse(); - throwBacktrack(e.getProblem()); } catch (Exception e) { logException( "baseSpecifier_2::addBaseSpecifier", e ); //$NON-NLS-1$ 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 79d1dd5b2ca..8aa75580a38 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 @@ -931,6 +931,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto //Its possible that the parent is not an IContainerSymbol if its a template parameter or some kinds of template instances ISymbol symbol = lookupQualifiedName( classSymbol, parentClassName, references, true ); + + if( symbol == null ) + handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND,parentClassName.toString(), parentClassName.getStartOffset(), parentClassName.getEndOffset(), parentClassName.getLineNumber(), true); + else if( symbol instanceof ITemplateSymbol ) + handleProblem( IProblem.SEMANTIC_INVALID_TEMPLATE_ARGUMENT, parentClassName.toString(), parentClassName.getStartOffset(), parentClassName.getEndOffset(), parentClassName.getLineNumber(), true); + List [] templateArgumentLists = parentClassName.getTemplateIdArgLists(); if( templateArgumentLists != null ) {