Skip to main content

[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:

Back to the top