diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index e24d13be73a..5194cf69daa 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -2532,5 +2532,17 @@ public class CompleteParseASTTest extends CompleteParseBaseTest writer.write("if (WIFEXITED(test)) {}\n}\n"); //$NON-NLS-1$ parse(writer.toString()); } + + 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()); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java index a9976e54536..0b522985725 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java @@ -2612,6 +2612,7 @@ public class Scanner2 implements IScanner, IScannerData { int currarg = -1; CharArrayObjectMap argmap = new CharArrayObjectMap(arglist.length); + boolean insideString = false; while (bufferPos[bufferStackPos] < limit) { skipOverWhiteSpace(); @@ -2632,13 +2633,22 @@ public class Scanner2 implements IScanner, IScannerData { 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();