From b36410c4ee412ed06b32bf46b03d01641c89b059 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 23 Nov 2004 15:22:42 +0000 Subject: [PATCH] Fixed bug in GNUCSourceParser regarding parsing typedefed anonymous structs as parameters in a function definition. --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 6 ++ .../core/parser2/c/GNUCSourceParser.java | 98 ++++++------------- 2 files changed, 38 insertions(+), 66 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index a86a0b8a939..c194f9cd204 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -712,5 +712,11 @@ public class AST2Tests extends AST2BaseTest { assertEquals( label_1, label_2 ); } + public void testAnonStruct() throws Exception + { + StringBuffer buffer = new StringBuffer( "typedef struct { } X;\n"); //$NON-NLS-1$ + buffer.append( "int f( X x );"); //$NON-NLS-1$ + parse( buffer.toString(), ParserLanguage.C ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser2/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser2/c/GNUCSourceParser.java index 64ba18b1d0e..c1efd4ec8a8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser2/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser2/c/GNUCSourceParser.java @@ -1580,74 +1580,40 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { for (;;) { switch (LT(1)) { case IToken.tLPAREN: - boolean failed = false; - // temporary fix for initializer/function declaration - // ambiguity - if (!LA(2).looksLikeExpression()) { - if (LT(2) == IToken.tIDENTIFIER) { - IToken newMark = mark(); - consume(IToken.tLPAREN); - ITokenDuple queryName = null; - try { - try { - IToken i = identifier(); - queryName = TokenFactory.createTokenDuple( - i, i); - // look it up - failed = true; - } catch (Exception e) { - int endOffset = (lastToken != null) ? lastToken - .getEndOffset() - : 0; - logException( - "declarator:queryIsTypeName", e); //$NON-NLS-1$ - throwBacktrack(startingOffset, endOffset, - line, newMark.getFilename()); - } - } catch (BacktrackException b) { - failed = true; - } - - if (queryName != null) - queryName.freeReferences(); - backup(newMark); - } - } - if ((!LA(2).looksLikeExpression() && !failed)) { - // parameterDeclarationClause - // d.setIsFunction(true); - // TODO need to create a temporary scope object here - consume(IToken.tLPAREN); - isFunction = true; - boolean seenParameter = false; - parameterDeclarationLoop: for (;;) { - switch (LT(1)) { - case IToken.tRPAREN: - consume(); - break parameterDeclarationLoop; - case IToken.tELLIPSIS: - consume(); - encounteredVarArgs = true; - break; - case IToken.tCOMMA: - consume(); - seenParameter = false; - break; - default: - int endOffset = (lastToken != null) ? lastToken - .getEndOffset() : 0; - if (seenParameter) - throwBacktrack(startingOffset, endOffset, - line, fn); - IASTParameterDeclaration pd = parameterDeclaration(); - if (parameters == Collections.EMPTY_LIST) - parameters = new ArrayList( - DEFAULT_PARAMETERS_LIST_SIZE); - parameters.add(pd); - seenParameter = true; - } + // parameterDeclarationClause + // d.setIsFunction(true); + // TODO need to create a temporary scope object here + consume(IToken.tLPAREN); + isFunction = true; + boolean seenParameter = false; + parameterDeclarationLoop: for (;;) { + switch (LT(1)) { + case IToken.tRPAREN: + consume(); + break parameterDeclarationLoop; + case IToken.tELLIPSIS: + consume(); + encounteredVarArgs = true; + break; + case IToken.tCOMMA: + consume(); + seenParameter = false; + break; + default: + int endOffset = (lastToken != null) ? lastToken + .getEndOffset() : 0; + if (seenParameter) + throwBacktrack(startingOffset, endOffset, + line, fn); + IASTParameterDeclaration pd = parameterDeclaration(); + if (parameters == Collections.EMPTY_LIST) + parameters = new ArrayList( + DEFAULT_PARAMETERS_LIST_SIZE); + parameters.add(pd); + seenParameter = true; } } + break; case IToken.tLBRACKET: if( arrayMods == Collections.EMPTY_LIST )