diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java index 68253696b52..1e2146b6ee1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java @@ -282,4 +282,15 @@ public class SelectionParseTest extends SelectionParseBaseTest { int startIndex = code.indexOf( "foo(1)"); //$NON-NLS-1$ parse( code, startIndex, startIndex + 3 ); } + + public void testBug66744() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "enum EColours { RED, GREEN, BLUE }; \n" ); //$NON-NLS-1$ + writer.write( "void foo() { EColours color = GREEN; } \n" ); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( "EColours color"); //$NON-NLS-1$ + parse( code, startIndex, startIndex + 8 ); + } } 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 7414ff648c0..86f712e7faf 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 @@ -2651,6 +2651,7 @@ public abstract class Parser extends ExpressionParser implements IParser IToken t = consume(IToken.tRBRACE); enumeration.setEndingOffsetAndLineNumber(t.getEndOffset(), t.getLineNumber()); enumeration.acceptElement( requestor, astFactory.getReferenceManager() ); + handleEnumeration( enumeration ); sdw.setTypeSpecifier(enumeration); } else @@ -2660,7 +2661,8 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } } - /** + + /** * Parse a class/struct/union definition. * * classSpecifier @@ -3339,6 +3341,11 @@ public abstract class Parser extends ExpressionParser implements IParser } + protected void handleEnumeration(IASTEnumerationSpecifier enumeration) throws EndOfFileException { + cleanupLastToken(); + handleOffsetableNamedElement( enumeration ); + } + /** * @param expression */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java index 050eaee85e4..b2f811c37a5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java @@ -27,6 +27,7 @@ import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode; import org.eclipse.cdt.core.parser.ast.IASTDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.parser.ast.IASTEnumerator; import org.eclipse.cdt.core.parser.ast.IASTExpression; import org.eclipse.cdt.core.parser.ast.IASTFunction; @@ -376,4 +377,15 @@ public class SelectionParser extends ContextualParser { throw new EndOfFileException(); } } + + protected void handleEnumeration(IASTEnumerationSpecifier enumeration) throws EndOfFileException { + if( ! tokenDupleCompleted() ) + super.handleEnumeration(enumeration); + else + { + contextNode = enumeration; + handleOffsetableNamedElement( enumeration ); + throw new EndOfFileException(); + } + } }