From b82f3de2e3bb2e6de7040602a5edba2e22af4310 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 3 Apr 2012 15:56:25 +0200 Subject: [PATCH] Bug 375739: #ifdef nested in macro-expansion. --- .../tests/scanner/PreprocessorBugsTests.java | 16 ++++++++++++++++ .../core/parser/scanner/ScannerContext.java | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorBugsTests.java index cbc7925b4d0..109ebf4a0eb 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorBugsTests.java @@ -263,6 +263,22 @@ public class PreprocessorBugsTests extends PreprocessorTestsBase { validateProblemCount(2); // the inclusions } + // #define UNFOLD(v,x) v:x + // UNFOLD("A", + // #ifdef X + // "B") + // #else + // "C") /* parse error in this line */ + // #endif + public void testDirectiveInExpansion_Bug375739() throws Exception { + initializeScanner(); + validateString("A"); + validateToken(IToken.tCOLON); + validateString("C"); + validateEOF(); + validateProblemCount(0); + } + // #if 0xe000 // ok // #endif diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerContext.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerContext.java index 7b387bc886b..d509ba7d373 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerContext.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerContext.java @@ -224,7 +224,7 @@ final class ScannerContext { cond.fTakeElse= false; newState= cond.fInitialState; } else if (withinExpansion) { - newState= CodeState.eParseInactive; + newState= CodeState.eSkipInactive; } else { newState= fInactiveState; }