From 59f4a0324234ac35d91bba225978f6683dea06c9 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Fri, 18 Jun 2004 15:49:21 +0000 Subject: [PATCH] Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=67834. Thanks to Dave for the JUnit test. --- .../core/parser/tests/ScannerTestCase.java | 23 +++++++++++++++++++ .../core/parser/ExpressionParser.java | 10 +++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java index d073fb1289b..891725391e3 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java @@ -674,6 +674,29 @@ public class ScannerTestCase extends BaseScannerTest } } + public void testBug67834() throws Exception { + initializeScanner( + "#if ! BAR\n" + //$NON-NLS-1$ + "foo\n" + //$NON-NLS-1$ + "#else\n" + //$NON-NLS-1$ + "bar\n" + //$NON-NLS-1$ + "#endif\n" //$NON-NLS-1$ + ); //$NON-NLS-1$ + validateIdentifier("foo"); //$NON-NLS-1$ + validateEOF(); + validateBalance(); + + initializeScanner( + "#if ! (BAR)\n" + //$NON-NLS-1$ + "foo\n" + //$NON-NLS-1$ + "#else\n" + //$NON-NLS-1$ + "bar\n" + //$NON-NLS-1$ + "#endif\n" //$NON-NLS-1$ + ); //$NON-NLS-1$ + validateIdentifier("foo"); //$NON-NLS-1$ + validateEOF(); + validateBalance(); + } public void testPreprocessorMacros() { try diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java index 15c12bf8e2a..559640fe65c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java @@ -1408,12 +1408,20 @@ public class ExpressionParser implements IExpressionParser, IParserData { typeId.freeReferences(astFactory.getReferenceManager()); throw bte; } - mark = null; // clean up mark so that we can garbage collect + if (templateIdScopes != null) { templateIdScopes.pop(); popped = true; } IASTExpression castExpression = castExpression(scope, kind, key); + if( castExpression != null && castExpression.getExpressionKind() == IASTExpression.Kind.PRIMARY_EMPTY ) + { + backup( mark ); + if (typeId != null) + typeId.freeReferences(astFactory.getReferenceManager()); + return unaryExpression(scope, kind, key); + } + mark = null; // clean up mark so that we can garbage collect try { return astFactory.createExpression(scope, IASTExpression.Kind.CASTEXPRESSION, castExpression,