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:
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();
|
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue