mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
Fix and Testcase for 197633, syntax error with variadic macro.
This commit is contained in:
parent
dc537c5cd0
commit
f06aafc908
2 changed files with 33 additions and 23 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue