diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index e72d2f8efc2..cdc8b9357ab 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -10572,4 +10572,13 @@ public class AST2CPPTests extends AST2TestBase { public void testParenthesizedReferenceArgument_424898() throws Exception { parseAndCheckBindings(); } + + // typedef unsigned char u8; + // + // #ifndef X + // u8 var; + // #endif + public void testU8TokenAfterIfdef_429361() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java index 90c2925af9f..d7e6782e9ac 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java @@ -90,10 +90,17 @@ final public class Lexer implements ITokenSequence { private Token fLastToken; // For the few cases where we have to lookahead more than one character + private int fMarkPhase3Offset; + private int fMarkPhase3EndOffset; + private int fMarkPhase3PrefetchedChar; + + // To store the entire state. Note that we don't reuse the variables + // used for saving the phase3 because calls to markPhase3() and + // restorePhase3() can occur in between calls to saveState() and + // restoreState(). private int fMarkOffset; private int fMarkEndOffset; private int fMarkPrefetchedChar; - // To store the entire state. private boolean fMarkInsideIncludeDirective; private Token fMarkToken; private Token fMarkLastToken; @@ -1006,18 +1013,18 @@ final public class Lexer implements ITokenSequence { * with a long prefix. */ private void markPhase3() { - fMarkOffset= fOffset; - fMarkEndOffset= fEndOffset; - fMarkPrefetchedChar= fCharPhase3; + fMarkPhase3Offset= fOffset; + fMarkPhase3EndOffset= fEndOffset; + fMarkPhase3PrefetchedChar= fCharPhase3; } /** * Restores a previously saved state of phase3. */ private void restorePhase3() { - fOffset= fMarkOffset; - fEndOffset= fMarkEndOffset; - fCharPhase3= fMarkPrefetchedChar; + fOffset= fMarkPhase3Offset; + fEndOffset= fMarkPhase3EndOffset; + fCharPhase3= fMarkPhase3PrefetchedChar; } /**