1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Fix and Testcase for 197633, syntax error with variadic macro.

This commit is contained in:
Markus Schorn 2007-07-26 13:44:54 +00:00
parent dc537c5cd0
commit f06aafc908
2 changed files with 33 additions and 23 deletions

View file

@ -3908,4 +3908,20 @@ public class AST2Tests extends AST2BaseTest {
} }
} }
// #define foo(f,...)
// void bar(void){}
// int main(int argc, char **argv) {
// foo("a", bar); // ok
// foo("a", bar, bar); // ok
// foo("a", bar()); // Eclipse Syntax error
// foo("a", bar, bar()); // Eclipse Syntax error
// foo("a", bar(), bar); // Eclipse Syntax error
// return 0;
// }
public void testBug197633_parenthesisInVarargMacros() throws Exception {
StringBuffer buffer = getContents(1)[0];
final String content = buffer.toString();
parse( content, ParserLanguage.CPP);
parse( content, ParserLanguage.C);
}
} }

View file

@ -2992,6 +2992,10 @@ abstract class BaseScanner implements IScanner {
skipOverWhiteSpace(); skipOverWhiteSpace();
} }
--bufferPos[bufferStackPos]; --bufferPos[bufferStackPos];
// correct argEnd when reaching limit, (bug 179383)
if (argEnd==limit) {
argEnd--;
}
return argEnd; return argEnd;
} }
@ -3279,7 +3283,6 @@ abstract class BaseScanner implements IScanner {
int currarg = 0; int currarg = 0;
CharArrayObjectMap argmap = new CharArrayObjectMap(arglist.length); CharArrayObjectMap argmap = new CharArrayObjectMap(arglist.length);
boolean insideString = false;
while (bufferPos[bufferStackPos] < limit) { while (bufferPos[bufferStackPos] < limit) {
skipOverWhiteSpace(); skipOverWhiteSpace();
@ -3311,36 +3314,27 @@ abstract class BaseScanner implements IScanner {
int argstart = bufferPos[bufferStackPos]; int argstart = bufferPos[bufferStackPos];
int argend = -1; int argend = -1;
if ((macro.hasGCCVarArgs() || macro.hasVarArgs()) if ((macro.hasGCCVarArgs() || macro.hasVarArgs()) && currarg == macro.getVarArgsPosition()) {
&& currarg == macro.getVarArgsPosition()) {
--bufferPos[bufferStackPos]; // go back to first char of macro arguments
// there are varargs and the other parameters have been accounted // there are varargs and the other parameters have been accounted
// for, the rest will replace __VA_ARGS__ or name where // for, the rest will replace __VA_ARGS__ or name where
// "name..." is the parameter // "name..." is the parameter
do { for (;;) {
if (buffer[bufferPos[bufferStackPos]] == '"') { argend= skipOverMacroArg();
if (insideString) skipOverWhiteSpace();
insideString = false; // to continue we need at least a comma and another char.
else if (bufferPos[bufferStackPos]+2 >= limit) {
insideString = true; break;
} }
if (buffer[++bufferPos[bufferStackPos]] == ')') {
if (!insideString bufferPos[bufferStackPos]--;
&& buffer[bufferPos[bufferStackPos]] == ')') { break;
--bufferPos[bufferStackPos];
break;
} }
} while (++bufferPos[bufferStackPos] < limit); // it's a comma
argend = bufferPos[bufferStackPos]; bufferPos[bufferStackPos]++;
}
} else { } else {
argend = skipOverMacroArg(); argend = skipOverMacroArg();
} }
// correct argend when reaching limit, (bug 179383)
if (argend==limit) {
argend--;
}
char[] arg = EMPTY_CHAR_ARRAY; char[] arg = EMPTY_CHAR_ARRAY;
int arglen = argend - argstart + 1; int arglen = argend - argstart + 1;