1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fixed defects 71094 & 68528.

This commit is contained in:
John Camelon 2004-08-04 19:26:31 +00:00
parent 39e2a667df
commit 903d1ac7a8
4 changed files with 252 additions and 153 deletions

View file

@ -2079,4 +2079,35 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
parse( writer.toString() ); parse( writer.toString() );
} }
public void testBug68528() throws Exception
{
Writer writer = new StringWriter();
writer.write( "namespace N526026\n" );
writer.write( "{\n" );
writer.write( "template <typename T>\n" );
writer.write( "class T526026\n" );
writer.write( "{\n" );
writer.write( "typedef int diff;\n" );
writer.write( "};\n" );
writer.write( "\n" );
writer.write( "template<typename T>\n" );
writer.write( "inline T526026< T >\n" );
writer.write( "operator+(typename T526026<T>::diff d, const T526026<T> & x )\n" );
writer.write( "{ return T526026< T >(); }\n" );
writer.write( "}\n" );
parse( writer.toString(), false );
}
public void testBug71094() throws Exception
{
Writer writer = new StringWriter();
writer.write( "using namespace DOESNOTEXIST;\n" );
writer.write( "class A { int x; };\n" );
Iterator i = parse( writer.toString(), false ).getDeclarations();
assertTrue( i.hasNext() );
assertTrue( i.next() instanceof IASTAbstractTypeSpecifierDeclaration );
assertFalse( i.hasNext() );
}
} }

View file

@ -504,6 +504,7 @@ public class CompleteParseBaseTest extends TestCase
*/ */
public void exitCompilationUnit(IASTCompilationUnit cu ) public void exitCompilationUnit(IASTCompilationUnit cu )
{ {
popScope();
} }
@ -525,12 +526,14 @@ public class CompleteParseBaseTest extends TestCase
{ {
Scope s = (Scope)scopes.pop(); Scope s = (Scope)scopes.pop();
h.put( s.getScope(), s ); h.put( s.getScope(), s );
--depth;
return s; return s;
} }
protected void pushScope( IASTScope scope ) protected void pushScope( IASTScope scope )
{ {
scopes.push( new Scope( scope )); scopes.push( new Scope( scope ));
++depth;
} }
Hashtable h = new Hashtable(); Hashtable h = new Hashtable();
@ -547,6 +550,7 @@ public class CompleteParseBaseTest extends TestCase
List problems = new ArrayList(); List problems = new ArrayList();
private int depth = 0;
public Iterator getProblems() { public Iterator getProblems() {
return problems.iterator(); return problems.iterator();
@ -709,6 +713,7 @@ public class CompleteParseBaseTest extends TestCase
protected void pushCodeScope(IASTCodeScope scope) protected void pushCodeScope(IASTCodeScope scope)
{ {
scopes.push( new CodeScope( scope ) ); scopes.push( new CodeScope( scope ) );
++depth;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -757,6 +762,13 @@ public class CompleteParseBaseTest extends TestCase
public void acceptFriendDeclaration(IASTDeclaration declaration) { public void acceptFriendDeclaration(IASTDeclaration declaration) {
getCurrentScope().addDeclaration( declaration ); getCurrentScope().addDeclaration( declaration );
} }
/**
* @return
*/
public boolean isBalanced() {
return depth == 0;
}
} }
protected Iterator getNestedScopes( IASTCodeScope scope ) protected Iterator getNestedScopes( IASTCodeScope scope )
@ -797,7 +809,10 @@ public class CompleteParseBaseTest extends TestCase
// throw exception if there are generated IProblems // throw exception if there are generated IProblems
if( (! parseResult || callback.getProblems().hasNext() ) && throwOnError ) throw new ParserException( "FAILURE"); //$NON-NLS-1$ if( (! parseResult || callback.getProblems().hasNext() ) && throwOnError ) throw new ParserException( "FAILURE"); //$NON-NLS-1$
if( parseResult ) if( parseResult )
{
assertTrue( ((CompleteParser)parser).validateCaches()); assertTrue( ((CompleteParser)parser).validateCaches());
assertTrue( callback.isBalanced() );
}
return callback.getCompilationUnit(); return callback.getCompilationUnit();
} }

View file

@ -2896,7 +2896,8 @@ public class ExpressionParser implements IExpressionParser, IParserData {
*/ */
protected void errorHandling() throws EndOfFileException { protected void errorHandling() throws EndOfFileException {
int depth = ( LT(1) == IToken.tLBRACE ) ? 1 : 0; int depth = ( LT(1) == IToken.tLBRACE ) ? 1 : 0;
consume(); int type = consume().getType();
if( type == IToken.tSEMI ) return;
while (!((LT(1) == IToken.tSEMI && depth == 0) while (!((LT(1) == IToken.tSEMI && depth == 0)
|| (LT(1) == IToken.tRBRACE && depth == 1))) || (LT(1) == IToken.tRBRACE && depth == 1)))
{ {

View file

@ -319,6 +319,11 @@ public abstract class Parser extends ExpressionParser implements IParser
{ {
astUD = astFactory.createUsingDirective(scope, duple, firstToken.getOffset(), firstToken.getLineNumber(), last.getEndOffset(), last.getLineNumber()); astUD = astFactory.createUsingDirective(scope, duple, firstToken.getOffset(), firstToken.getLineNumber(), last.getEndOffset(), last.getLineNumber());
} }
catch( ASTSemanticException ase )
{
backup( last );
throwBacktrack( ase.getProblem() );
}
catch (Exception e1) catch (Exception e1)
{ {
logException( "usingClause:createUsingDirective", e1 ); //$NON-NLS-1$ logException( "usingClause:createUsingDirective", e1 ); //$NON-NLS-1$
@ -420,6 +425,8 @@ public abstract class Parser extends ExpressionParser implements IParser
} }
linkage.enterScope( requestor, astFactory.getReferenceManager() ); linkage.enterScope( requestor, astFactory.getReferenceManager() );
try
{
linkageDeclarationLoop : while (LT(1) != IToken.tRBRACE) linkageDeclarationLoop : while (LT(1) != IToken.tRBRACE)
{ {
int checkToken = LA(1).hashCode(); int checkToken = LA(1).hashCode();
@ -446,7 +453,11 @@ public abstract class Parser extends ExpressionParser implements IParser
// consume the } // consume the }
IToken lastTokenConsumed = consume(); IToken lastTokenConsumed = consume();
linkage.setEndingOffsetAndLineNumber(lastTokenConsumed.getEndOffset(), lastTokenConsumed.getLineNumber()); linkage.setEndingOffsetAndLineNumber(lastTokenConsumed.getEndOffset(), lastTokenConsumed.getLineNumber());
}
finally
{
linkage.exitScope( requestor, astFactory.getReferenceManager() ); linkage.exitScope( requestor, astFactory.getReferenceManager() );
}
return linkage; return linkage;
} }
// single declaration // single declaration
@ -468,8 +479,14 @@ public abstract class Parser extends ExpressionParser implements IParser
return null; return null;
} }
linkage.enterScope( requestor, astFactory.getReferenceManager() ); linkage.enterScope( requestor, astFactory.getReferenceManager() );
try
{
declaration(linkage, null, null, KeywordSetKey.DECLARATION); declaration(linkage, null, null, KeywordSetKey.DECLARATION);
}
finally
{
linkage.exitScope( requestor, astFactory.getReferenceManager() ); linkage.exitScope( requestor, astFactory.getReferenceManager() );
}
return linkage; return linkage;
} }
@ -522,9 +539,14 @@ public abstract class Parser extends ExpressionParser implements IParser
return null; return null;
} }
templateInstantiation.enterScope( requestor, astFactory.getReferenceManager() ); templateInstantiation.enterScope( requestor, astFactory.getReferenceManager() );
try
{
declaration(templateInstantiation, templateInstantiation, null, KeywordSetKey.DECLARATION); declaration(templateInstantiation, templateInstantiation, null, KeywordSetKey.DECLARATION);
templateInstantiation.setEndingOffsetAndLineNumber(lastToken.getEndOffset(), lastToken.getLineNumber()); templateInstantiation.setEndingOffsetAndLineNumber(lastToken.getEndOffset(), lastToken.getLineNumber());
} finally
{
templateInstantiation.exitScope( requestor, astFactory.getReferenceManager() ); templateInstantiation.exitScope( requestor, astFactory.getReferenceManager() );
}
return templateInstantiation; return templateInstantiation;
} }
@ -550,10 +572,16 @@ public abstract class Parser extends ExpressionParser implements IParser
return null; return null;
} }
templateSpecialization.enterScope(requestor, astFactory.getReferenceManager()); templateSpecialization.enterScope(requestor, astFactory.getReferenceManager());
try
{
declaration(templateSpecialization, templateSpecialization, null, KeywordSetKey.DECLARATION); declaration(templateSpecialization, templateSpecialization, null, KeywordSetKey.DECLARATION);
templateSpecialization.setEndingOffsetAndLineNumber( templateSpecialization.setEndingOffsetAndLineNumber(
lastToken.getEndOffset(), lastToken.getLineNumber()); lastToken.getEndOffset(), lastToken.getLineNumber());
}
finally
{
templateSpecialization.exitScope(requestor, astFactory.getReferenceManager()); templateSpecialization.exitScope(requestor, astFactory.getReferenceManager());
}
return templateSpecialization; return templateSpecialization;
} }
@ -581,13 +609,11 @@ public abstract class Parser extends ExpressionParser implements IParser
templateDecl.enterScope( requestor, astFactory.getReferenceManager() ); templateDecl.enterScope( requestor, astFactory.getReferenceManager() );
try{ try{
declaration(templateDecl, templateDecl, null, KeywordSetKey.DECLARATION ); declaration(templateDecl, templateDecl, null, KeywordSetKey.DECLARATION );
} catch( EndOfFileException e ){
templateDecl.setEndingOffsetAndLineNumber( lastToken.getEndOffset(), lastToken.getLineNumber() ); templateDecl.setEndingOffsetAndLineNumber( lastToken.getEndOffset(), lastToken.getLineNumber() );
} finally
{
templateDecl.exitScope( requestor, astFactory.getReferenceManager() ); templateDecl.exitScope( requestor, astFactory.getReferenceManager() );
throw e;
} }
templateDecl.setEndingOffsetAndLineNumber( lastToken.getEndOffset(), lastToken.getLineNumber() );
templateDecl.exitScope( requestor, astFactory.getReferenceManager() );
return templateDecl; return templateDecl;
} }
catch (BacktrackException bt) catch (BacktrackException bt)
@ -998,6 +1024,8 @@ public abstract class Parser extends ExpressionParser implements IParser
return null; return null;
} }
namespaceDefinition.enterScope( requestor, astFactory.getReferenceManager() ); namespaceDefinition.enterScope( requestor, astFactory.getReferenceManager() );
try
{
setCompletionValues(scope,CompletionKind.VARIABLE_TYPE, KeywordSetKey.DECLARATION ); setCompletionValues(scope,CompletionKind.VARIABLE_TYPE, KeywordSetKey.DECLARATION );
endDeclaration( namespaceDefinition ); endDeclaration( namespaceDefinition );
namespaceDeclarationLoop : while (LT(1) != IToken.tRBRACE) namespaceDeclarationLoop : while (LT(1) != IToken.tRBRACE)
@ -1030,7 +1058,11 @@ public abstract class Parser extends ExpressionParser implements IParser
namespaceDefinition.setEndingOffsetAndLineNumber( namespaceDefinition.setEndingOffsetAndLineNumber(
last.getOffset() + last.getLength(), last.getLineNumber()); last.getOffset() + last.getLength(), last.getLineNumber());
setCompletionValues(scope, kind, KeywordSetKey.DECLARATION ); setCompletionValues(scope, kind, KeywordSetKey.DECLARATION );
}
finally
{
namespaceDefinition.exitScope( requestor, astFactory.getReferenceManager() ); namespaceDefinition.exitScope( requestor, astFactory.getReferenceManager() );
}
return namespaceDefinition; return namespaceDefinition;
} }
else if( LT(1) == IToken.tASSIGN ) else if( LT(1) == IToken.tASSIGN )
@ -1244,6 +1276,8 @@ public abstract class Parser extends ExpressionParser implements IParser
IASTDeclaration declaration = (IASTDeclaration)l.get(0); IASTDeclaration declaration = (IASTDeclaration)l.get(0);
endDeclaration( declaration ); endDeclaration( declaration );
declaration.enterScope( requestor, astFactory.getReferenceManager() ); declaration.enterScope( requestor, astFactory.getReferenceManager() );
try
{
if( sdw.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier ) if( sdw.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier )
((IASTSimpleTypeSpecifier)sdw.getTypeSpecifier()).releaseReferences( astFactory.getReferenceManager() ); ((IASTSimpleTypeSpecifier)sdw.getTypeSpecifier()).releaseReferences( astFactory.getReferenceManager() );
@ -1253,8 +1287,11 @@ public abstract class Parser extends ExpressionParser implements IParser
handleFunctionBody((IASTScope)declaration ); handleFunctionBody((IASTScope)declaration );
((IASTOffsetableElement)declaration).setEndingOffsetAndLineNumber( ((IASTOffsetableElement)declaration).setEndingOffsetAndLineNumber(
lastToken.getEndOffset(), lastToken.getLineNumber()); lastToken.getEndOffset(), lastToken.getLineNumber());
}
finally
{
declaration.exitScope( requestor, astFactory.getReferenceManager() ); declaration.exitScope( requestor, astFactory.getReferenceManager() );
}
if( hasFunctionTryBlock ) if( hasFunctionTryBlock )
catchHandlerSequence( scope ); catchHandlerSequence( scope );
@ -2791,14 +2828,19 @@ public abstract class Parser extends ExpressionParser implements IParser
if (LT(1) == IToken.tCOLON) { if (LT(1) == IToken.tCOLON) {
baseSpecifier(astClassSpecifier); baseSpecifier(astClassSpecifier);
} }
if (LT(1) == IToken.tLBRACE) { if (LT(1) == IToken.tLBRACE) {
consume(IToken.tLBRACE); consume(IToken.tLBRACE);
setCompletionValues(astClassSpecifier, CompletionKind.FIELD_TYPE, setCompletionValues(astClassSpecifier, CompletionKind.FIELD_TYPE,
KeywordSetKey.MEMBER); KeywordSetKey.MEMBER);
astClassSpecifier.enterScope(requestor, astFactory astClassSpecifier.enterScope(requestor, astFactory
.getReferenceManager()); .getReferenceManager());
try
{
handleClassSpecifier(astClassSpecifier); handleClassSpecifier(astClassSpecifier);
memberDeclarationLoop : while (LT(1) != IToken.tRBRACE) { memberDeclarationLoop : while (LT(1) != IToken.tRBRACE)
{
int checkToken = LA(1).hashCode(); int checkToken = LA(1).hashCode();
switch (LT(1)) { switch (LT(1)) {
case IToken.t_public : case IToken.t_public :
@ -2839,7 +2881,6 @@ public abstract class Parser extends ExpressionParser implements IParser
IToken lt = consume(IToken.tRBRACE); IToken lt = consume(IToken.tRBRACE);
astClassSpecifier.setEndingOffsetAndLineNumber(lt.getEndOffset(), astClassSpecifier.setEndingOffsetAndLineNumber(lt.getEndOffset(),
lt.getLineNumber()); lt.getLineNumber());
try { try {
astFactory.signalEndOfClassSpecifier(astClassSpecifier); astFactory.signalEndOfClassSpecifier(astClassSpecifier);
} catch (Exception e1) { } catch (Exception e1) {
@ -2847,8 +2888,14 @@ public abstract class Parser extends ExpressionParser implements IParser
throwBacktrack(lt.getOffset(), lt.getEndOffset(), lt.getLineNumber(), lt.getFilename()); throwBacktrack(lt.getOffset(), lt.getEndOffset(), lt.getLineNumber(), lt.getFilename());
} }
}
finally
{
astClassSpecifier.exitScope(requestor, astFactory astClassSpecifier.exitScope(requestor, astFactory
.getReferenceManager()); .getReferenceManager());
}
} }
} }
@ -3270,6 +3317,8 @@ public abstract class Parser extends ExpressionParser implements IParser
newScope.enterScope(requestor, astFactory.getReferenceManager()); newScope.enterScope(requestor, astFactory.getReferenceManager());
} }
try
{
setCompletionValues((createNewScope ? newScope : scope), setCompletionValues((createNewScope ? newScope : scope),
CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.STATEMENT); CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.STATEMENT);
@ -3288,10 +3337,13 @@ public abstract class Parser extends ExpressionParser implements IParser
} }
consume(IToken.tRBRACE); consume(IToken.tRBRACE);
}
finally
{
if (createNewScope) if (createNewScope)
newScope.exitScope(requestor, astFactory.getReferenceManager()); newScope.exitScope(requestor, astFactory.getReferenceManager());
} }
}
protected IASTCompilationUnit compilationUnit; protected IASTCompilationUnit compilationUnit;
protected IToken simpleDeclarationMark; protected IToken simpleDeclarationMark;