[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] [FIXED] [79787][79490]
|
[FIXED][79787][Scanner] #error has extra
\r character at the end
[FIXED][79490][Scanner] char constants
not evaluated properly with #if
Both are Scanner problems that should
be in 2.1/Head.
Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java,v
retrieving revision 1.140
diff -u -r1.140 CompleteParseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java 20 Nov 2004 17:48:43 -0000 1.140
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java 30 Nov 2004 16:35:04 -0000
@@ -2480,5 +2480,38 @@
IASTVariable pBase = (IASTVariable)i.next();
assertEquals(pBase.getStartingLine(), 19);
}
+
+ public void testBug79787() throws Exception {
+ try {
+ parse("#error what?\r\n");
+ } catch (ParserException pe) {
+ // expected IProblem
+ } finally {
+ Iterator probs = callback.getProblems();
+ assertTrue( probs.hasNext() );
+ Object ipo = probs.next();
+ assertTrue( ipo instanceof IProblem );
+ IProblem ip = (IProblem)ipo;
+ assertEquals(ip.getArguments(), "what?");
+ }
+ }
}
Index: parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java,v
retrieving revision 1.39
diff -u -r1.39 Scanner2Test.java
--- parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java 27 Oct 2004 19:01:43 -0000 1.39
+++ parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java 30 Nov 2004 16:35:05 -0000
@@ -2266,4 +2266,32 @@
validateToken( IToken.tSEMI );
validateEOF();
}
+
+ public void testBug79490A() throws Exception {
+ Writer writer = new StringWriter();
+ writer.write("#define TEST 'n'\n"); //$NON-NLS-1$
+ writer.write("#if TEST == 'y'\n"); //$NON-NLS-1$
+ writer.write("#define TRUE 1\n"); //$NON-NLS-1$
+ writer.write("#else\n"); //$NON-NLS-1$
+ writer.write("#define FALSE 1\n"); //$NON-NLS-1$
+ writer.write("#endif\n"); //$NON-NLS-1$
+ initializeScanner( writer.toString() );
+ validateEOF();
+ validateDefinition("TEST", "'n'"); //$NON-NLS-1$ //$NON-NLS-2$
+ validateDefinition("FALSE", "1"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void testBug79490B() throws Exception {
+ Writer writer = new StringWriter();
+ writer.write("#define TEST 'y'\n"); //$NON-NLS-1$
+ writer.write("#if TEST == 'y'\n"); //$NON-NLS-1$
+ writer.write("#define TRUE 1\n"); //$NON-NLS-1$
+ writer.write("#else\n"); //$NON-NLS-1$
+ writer.write("#define FALSE 1\n"); //$NON-NLS-1$
+ writer.write("#endif\n"); //$NON-NLS-1$
+ initializeScanner( writer.toString() );
+ validateEOF();
+ validateDefinition("TEST", "'y'"); //$NON-NLS-1$ //$NON-NLS-2$
+ validateDefinition("TRUE", "1"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
}
Index: parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java,v
retrieving revision 1.13
diff -u -r1.13 ExpressionEvaluator.java
--- parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java 15 Nov 2004 22:17:43 -0000 1.13
+++ parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java 30 Nov 2004 16:34:50 -0000
@@ -254,6 +254,8 @@
}
handleProblem(IProblem.SCANNER_MISSING_R_PAREN, pos);
throw new EvalException("missing )"); //$NON-NLS-1$
+ case tCHAR:
+ return getChar();
default:
handleProblem(IProblem.SCANNER_EXPRESSION_SYNTAX_ERROR, pos);
throw new EvalException("expression syntax error"); //$NON-NLS-1$
@@ -332,6 +334,21 @@
return value;
}
+ private long getChar() throws EvalException {
+ long value = 0;
+
+ // if getting a character then make sure it's in '' otherwise leave it as 0
+ if (bufferPos[bufferStackPos] - 1 >= 0 &&
+ bufferPos[bufferStackPos] + 1 < bufferStack[bufferStackPos].length
+ && bufferStack[bufferStackPos][bufferPos[bufferStackPos] - 1] == '\''
+ && bufferStack[bufferStackPos][bufferPos[bufferStackPos] + 1] == '\'')
+ value = bufferStack[bufferStackPos][bufferPos[bufferStackPos]];
+
+ if (tokenType != tEOF)
+ nextToken();
+ return value;
+ }
+
private static char[] _defined = "defined".toCharArray(); //$NON-NLS-1$
private void nextToken() throws EvalException {
@@ -472,6 +489,11 @@
continue;
}
+ if (len == 1) { // is a character
+ tokenType = tCHAR;
+ return;
+ }
+
// undefined macro, assume 0
tokenValue = 0;
tokenType = tNUMBER;
@@ -878,6 +900,7 @@
private static final int tQUESTION = 25;
private static final int tCOLON = 26;
private static final int t_defined = 27;
+ private static final int tCHAR = 28;
private void pushContext(char[] buffer, Object data) {
if (++bufferStackPos == bufferStack.length) {
Index: parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java,v
retrieving revision 1.91
diff -u -r1.91 Scanner2.java
--- parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java 29 Nov 2004 21:00:31 -0000 1.91
+++ parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java 30 Nov 2004 16:34:50 -0000
@@ -1538,7 +1538,10 @@
skipOverWhiteSpace();
start = bufferPos[bufferStackPos] + 1;
skipToNewLine();
- len = bufferPos[bufferStackPos] - start;
+ if (bufferPos[bufferStackPos] - 1 > 0 && buffer[bufferPos[bufferStackPos] - 1] == '\r')
+ len = bufferPos[bufferStackPos] - start - 1;
+ else
+ len = bufferPos[bufferStackPos] - start;
handleProblem( IProblem.PREPROCESSOR_POUND_ERROR, start, CharArrayUtils.extract( buffer, start, len ));
break;
case ppEndif: