diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java index b81628933d7..edbcfac0746 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java @@ -2609,5 +2609,60 @@ public class Scanner2Test extends BaseScanner2Test initializeScanner(buffer.toString()); 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" ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index 8abaca26be4..a8acf224b6a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -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