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