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:
parent
39e2a667df
commit
903d1ac7a8
4 changed files with 252 additions and 153 deletions
|
@ -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() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue