Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] FIXED 79921, 79227


Fixed 79921 - [Scanner] problems with ')' inside a string being passed to va_args macro parm
Fixed 79227 - [Scanner][IProblem][Ethereal] "Unbounded string encountered" invalid IProblems with invalid offsets highlighting weird commented code

Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada


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.93
diff -u -r1.93 Scanner2.java
--- parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java	30 Nov 2004 18:51:49 -0000	1.93
+++ parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java	1 Dec 2004 20:54:51 -0000
@@ -2612,6 +2612,7 @@
 		int currarg = -1;
 		CharArrayObjectMap argmap = new CharArrayObjectMap(arglist.length);
 		
+		boolean insideString = false;
 		while (bufferPos[bufferStackPos] < limit) {
 			skipOverWhiteSpace();
 			
@@ -2632,13 +2633,22 @@
 			
 		    int argend = -1;
 		    if ((macro.hasGCCVarArgs() || macro.hasVarArgs()) && currarg == macro.getVarArgsPosition()) {
+		    	--bufferPos[bufferStackPos]; // go back to first char of macro args
+		    	
 		    	// there are varargs and the other parms have been accounted for, the rest will replace __VA_ARGS__ or name where "name..." is the parm
-		    	while (++bufferPos[bufferStackPos] < limit) {
-		    		if (buffer[bufferPos[bufferStackPos]] == ')') {
+		    	do {
+		    		if (buffer[bufferPos[bufferStackPos]] == '"') {
+		    			if (insideString) 
+		    				insideString = false; 
+		    			else 
+		    				insideString = true;
+		    		}
+		    		
+		    		if (!insideString && buffer[bufferPos[bufferStackPos]] == ')') {
 		    			--bufferPos[bufferStackPos];
 		    			break;
 		    		}
-		    	}
+		    	} while (++bufferPos[bufferStackPos] < limit);
 		    	argend = bufferPos[bufferStackPos];
 		    } else
 		    	argend = skipOverMacroArg(); 
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.142
diff -u -r1.142 CompleteParseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	30 Nov 2004 18:51:47 -0000	1.142
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	1 Dec 2004 20:50:09 -0000
@@ -2514,5 +2514,34 @@
 		}
 	}
     	
+    public void testBug79921_79227() throws Exception {
+    	Writer writer = new StringWriter();
+    	writer.write("/* some\n* commented\n* code\n*/\n"); //$NON-NLS-1$
+    	writer.write("#define g_message(...) g_log (1, 2, __VA_ARGS__);\n"); //$NON-NLS-1$
+    	writer.write("int g_log (int a, int b, ...) { return 0; }\n"); //$NON-NLS-1$
+    	writer.write("int foo2() {\n"); //$NON-NLS-1$
+    	writer.write("g_message(\"a string [as] f%2.2x (%2)\")               \\\n"); //$NON-NLS-1$
+    	writer.write("//    	                                       ^ the culprit\n}\n"); //$NON-NLS-1$
+    	parse(writer.toString());
+    }
 }

Back to the top