mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix and Testcases for 200830, macro expansion performed inside of string literals.
This commit is contained in:
parent
33b66fff45
commit
d6ce933a26
2 changed files with 85 additions and 0 deletions
|
@ -2610,4 +2610,59 @@ public class Scanner2Test extends BaseScanner2Test
|
|||
validateIdentifier("bug182180");
|
||||
}
|
||||
|
||||
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=200830
|
||||
public void testBug200830_1() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("#define string BROKEN\r\n");
|
||||
buffer.append("#define macro(inst) (char*)inst\r\n");
|
||||
buffer.append("macro(\"string\");\r\n");
|
||||
initializeScanner( buffer.toString() );
|
||||
validateToken( IToken.tLPAREN );
|
||||
validateToken( IToken.t_char );
|
||||
validateToken( IToken.tSTAR );
|
||||
validateToken( IToken.tRPAREN );
|
||||
validateString( "string" );
|
||||
}
|
||||
|
||||
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=200830
|
||||
public void testBug200830_2() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("#define string BROKEN\r\n");
|
||||
buffer.append("#define macro(inst) (char*)inst\r\n");
|
||||
buffer.append("macro(\" string \");\r\n");
|
||||
initializeScanner( buffer.toString() );
|
||||
validateToken( IToken.tLPAREN );
|
||||
validateToken( IToken.t_char );
|
||||
validateToken( IToken.tSTAR );
|
||||
validateToken( IToken.tRPAREN );
|
||||
validateString( " string " );
|
||||
}
|
||||
|
||||
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=200830
|
||||
public void testBug200830_3() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("#define string BROKEN\r\n");
|
||||
buffer.append("#define macro(inst) (char*)inst\r\n");
|
||||
buffer.append("macro(\"\\\"string \");\r\n");
|
||||
initializeScanner( buffer.toString() );
|
||||
validateToken( IToken.tLPAREN );
|
||||
validateToken( IToken.t_char );
|
||||
validateToken( IToken.tSTAR );
|
||||
validateToken( IToken.tRPAREN );
|
||||
validateString( "\\\"string " );
|
||||
}
|
||||
|
||||
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=200830
|
||||
public void testBug200830_4() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("#define s B\r\n");
|
||||
buffer.append("#define macro(inst) (char*)inst\r\n");
|
||||
buffer.append("macro('s');\r\n");
|
||||
initializeScanner( buffer.toString() );
|
||||
validateToken( IToken.tLPAREN );
|
||||
validateToken( IToken.t_char );
|
||||
validateToken( IToken.tSTAR );
|
||||
validateToken( IToken.tRPAREN );
|
||||
validateChar( "s" );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3417,6 +3417,36 @@ abstract class BaseScanner implements IScanner {
|
|||
}
|
||||
end = pos - 1;
|
||||
}
|
||||
else if (c == '"') {
|
||||
boolean escaped= false;
|
||||
while (++pos < limit) {
|
||||
c = arg[pos];
|
||||
if (!escaped && c == '"') {
|
||||
break;
|
||||
}
|
||||
if (c == '\\') {
|
||||
escaped= !escaped;
|
||||
}
|
||||
else {
|
||||
escaped= false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (c == '\'') {
|
||||
boolean escaped= false;
|
||||
while (++pos < limit) {
|
||||
c = arg[pos];
|
||||
if (!escaped && c == '\'') {
|
||||
break;
|
||||
}
|
||||
if (c == '\\') {
|
||||
escaped= !escaped;
|
||||
}
|
||||
else {
|
||||
escaped= false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (start != -1 && end >= start) {
|
||||
//Check for macro expansion
|
||||
|
|
Loading…
Add table
Reference in a new issue