diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index 04fea22edf9..bab133316f8 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -2325,5 +2325,12 @@ public class CompleteParseASTTest extends CompleteParseBaseTest Iterator i = callback.getProblems(); assertFalse( i.hasNext() ); } + public void testBug77805() throws Exception { + Writer writer = new StringWriter(); + writer.write("#if X // Do something only if X is true\n"); //$NON-NLS-1$ + writer.write("/* some statements */\n"); //$NON-NLS-1$ + writer.write("#endif\n"); //$NON-NLS-1$ + parse(writer.toString()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java index b4efd0f4970..4892cff4742 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java @@ -798,9 +798,24 @@ public class ExpressionEvaluator { if (p + 1 < limit) { if (buffer[p + 1] == '/') { // C++ comment, skip rest of line - return; - } else if (buffer[p + 1] == '*') { - // C comment, find closing */ + for (bufferPos[bufferStackPos] += 2; + bufferPos[bufferStackPos] < limit; + ++bufferPos[bufferStackPos]) { + p = bufferPos[bufferStackPos]; + if (buffer[p] == '\\' && p + 1 < limit && buffer[p + 1] == '\n') { + bufferPos[bufferStackPos]+=2; + continue; + } + if (buffer[p] == '\\' && p + 1 < limit && buffer[p + 1] == '\r' && p + 2 < limit && buffer[p + 2] == '\n') { + bufferPos[bufferStackPos]+=3; + continue; + } + + if (buffer[p] == '\n') + break; // break when find non-escaped newline + } + continue; + } else if (buffer[p + 1] == '*') { // C comment, find closing */ for (bufferPos[bufferStackPos] += 2; bufferPos[bufferStackPos] < limit; ++bufferPos[bufferStackPos]) {