[
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());
+ }
}