mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 303969: ArrayOutOfBoundsException parsing #error without argument.
This commit is contained in:
parent
ef1c9cc92b
commit
555761c168
3 changed files with 35 additions and 0 deletions
|
@ -275,4 +275,27 @@ public class PreprocessorBugsTests extends PreprocessorTestsBase {
|
||||||
validateEOF();
|
validateEOF();
|
||||||
validateProblemCount(0);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1110,6 +1110,10 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
||||||
case IPreprocessorDirective.ppError:
|
case IPreprocessorDirective.ppError:
|
||||||
int condOffset= lexer.nextToken().getOffset();
|
int condOffset= lexer.nextToken().getOffset();
|
||||||
condEndOffset= lexer.consumeLine(ORIGIN_PREPROCESSOR_DIRECTIVE);
|
condEndOffset= lexer.consumeLine(ORIGIN_PREPROCESSOR_DIRECTIVE);
|
||||||
|
// Missing argument
|
||||||
|
if (condEndOffset < condOffset) {
|
||||||
|
condOffset= condEndOffset;
|
||||||
|
}
|
||||||
if (fCurrentContext.getCodeState() == CodeState.eActive) {
|
if (fCurrentContext.getCodeState() == CodeState.eActive) {
|
||||||
int endOffset= lexer.currentToken().getEndOffset();
|
int endOffset= lexer.currentToken().getEndOffset();
|
||||||
final char[] warning= lexer.getInputChars(condOffset, condEndOffset);
|
final char[] warning= lexer.getInputChars(condOffset, condEndOffset);
|
||||||
|
@ -1123,6 +1127,10 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
||||||
case IPreprocessorDirective.ppPragma:
|
case IPreprocessorDirective.ppPragma:
|
||||||
condOffset= lexer.nextToken().getOffset();
|
condOffset= lexer.nextToken().getOffset();
|
||||||
condEndOffset= lexer.consumeLine(ORIGIN_PREPROCESSOR_DIRECTIVE);
|
condEndOffset= lexer.consumeLine(ORIGIN_PREPROCESSOR_DIRECTIVE);
|
||||||
|
// Missing argument
|
||||||
|
if (condEndOffset < condOffset) {
|
||||||
|
condOffset= condEndOffset;
|
||||||
|
}
|
||||||
if (fCurrentContext.getCodeState() == CodeState.eActive) {
|
if (fCurrentContext.getCodeState() == CodeState.eActive) {
|
||||||
int endOffset= lexer.currentToken().getEndOffset();
|
int endOffset= lexer.currentToken().getEndOffset();
|
||||||
fLocationMap.encounterPoundPragma(startOffset, condOffset, condEndOffset, endOffset);
|
fLocationMap.encounterPoundPragma(startOffset, condOffset, condEndOffset, endOffset);
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.eclipse.cdt.core.parser.IGCCToken;
|
||||||
import org.eclipse.cdt.core.parser.IProblem;
|
import org.eclipse.cdt.core.parser.IProblem;
|
||||||
import org.eclipse.cdt.core.parser.IToken;
|
import org.eclipse.cdt.core.parser.IToken;
|
||||||
import org.eclipse.cdt.core.parser.OffsetLimitReachedException;
|
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
|
* 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) {
|
public char[] getInputChars(int offset, int endOffset) {
|
||||||
final int length= endOffset-offset;
|
final int length= endOffset-offset;
|
||||||
|
if (length <= 0) {
|
||||||
|
return CharArrayUtils.EMPTY;
|
||||||
|
}
|
||||||
final char[] result= new char[length];
|
final char[] result= new char[length];
|
||||||
fInput.arraycopy(offset, result, 0, length);
|
fInput.arraycopy(offset, result, 0, length);
|
||||||
return result;
|
return result;
|
||||||
|
|
Loading…
Add table
Reference in a new issue