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 82eeac7506a..08d8fed97fc 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 @@ -275,4 +275,27 @@ public class PreprocessorBugsTests extends PreprocessorTestsBase { validateEOF(); validateProblemCount(0); } + + // #error // + // #warning // + // #pragma // not marked as problem + // #define // + // #include // + // #undef // + // #if // + // #endif + // #ifdef // + // #endif + // #ifndef // + // #endif + // #if 0 + // #elif // + // #endif + // a + public void testMissingArgument_Bug303969() throws Exception { + initializeScanner(); + validateIdentifier("a"); + validateEOF(); + validateProblemCount(9); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java index 9fcefe8490c..6b5df9223a0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java @@ -1110,6 +1110,10 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable { case IPreprocessorDirective.ppError: int condOffset= lexer.nextToken().getOffset(); condEndOffset= lexer.consumeLine(ORIGIN_PREPROCESSOR_DIRECTIVE); + // Missing argument + if (condEndOffset < condOffset) { + condOffset= condEndOffset; + } if (fCurrentContext.getCodeState() == CodeState.eActive) { int endOffset= lexer.currentToken().getEndOffset(); final char[] warning= lexer.getInputChars(condOffset, condEndOffset); @@ -1123,6 +1127,10 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable { case IPreprocessorDirective.ppPragma: condOffset= lexer.nextToken().getOffset(); condEndOffset= lexer.consumeLine(ORIGIN_PREPROCESSOR_DIRECTIVE); + // Missing argument + if (condEndOffset < condOffset) { + condOffset= condEndOffset; + } if (fCurrentContext.getCodeState() == CodeState.eActive) { int endOffset= lexer.currentToken().getEndOffset(); fLocationMap.encounterPoundPragma(startOffset, condOffset, condEndOffset, endOffset); 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 51ef841a4db..5ad61e2a86f 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 @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.parser.IGCCToken; import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.core.parser.OffsetLimitReachedException; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; /** * In short this class converts line endings (to '\n') and trigraphs @@ -1139,6 +1140,9 @@ final public class Lexer implements ITokenSequence { */ public char[] getInputChars(int offset, int endOffset) { final int length= endOffset-offset; + if (length <= 0) { + return CharArrayUtils.EMPTY; + } final char[] result= new char[length]; fInput.arraycopy(offset, result, 0, length); return result;