From 5f0a6852c9b5a443e8af55a1618224701db53830 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 14 Jun 2007 13:31:49 +0000 Subject: [PATCH] Fix & testcase for 192639, AssertionFailedError in parser. --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 11 +++++++++++ .../core/parser/scanner2/BaseScanner.java | 19 ++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index eb2af9c503c..81ef7184d5c 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -113,6 +113,7 @@ public class AST2Tests extends AST2BaseTest { super(name); } + public void testBug75189() throws Exception { parseAndCheckBindings( "struct A{};\n typedef int (*F) (struct A*);" ); //$NON-NLS-1$ parseAndCheckBindings( "struct A{};\n typedef int (*F) (A*);", ParserLanguage.CPP ); //$NON-NLS-1$ @@ -3867,4 +3868,14 @@ public class AST2Tests extends AST2BaseTest { assertInstance(col.getName(13).resolveBinding(), IProblemBinding.class); } } + + // /* a comment */ + // #define INVALID(a, b) ## a ## b + // INVALID(1, 2) + // + public void test192639() throws Exception { + StringBuffer buffer = getContents(1)[0]; + parse( buffer.toString(), ParserLanguage.CPP, false, false, true ); + parse( buffer.toString(), ParserLanguage.C, false, false, true ); + } } 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 4fe054f36ff..abc31890a63 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 @@ -3575,7 +3575,7 @@ abstract class BaseScanner implements IScanner { char[] prevArg = null; int prevArgStart = -1; int prevArgLength = -1; - int prevArgTarget = -1; + int prevArgTarget = 0; int limit = expansion.length; @@ -3628,9 +3628,15 @@ abstract class BaseScanner implements IScanner { // copy what we haven't so far if (++lastcopy < idstart) { int n = idstart - lastcopy; - if (result != null) + if (result != null) { + // the outpos may be set back when prevConcat is true, so make sure we + // stay in bounds. + if (prevConcat && outpos+n > result.length) { + n= result.length- outpos; + } System.arraycopy(expansion, lastcopy, result, outpos, n); + } outpos += n; } @@ -4257,14 +4263,14 @@ abstract class BaseScanner implements IScanner { } protected IToken scanComment() { char[] buffer = bufferStack[bufferStackPos]; - int limit = bufferLimit[bufferStackPos]; + final int limit = bufferLimit[bufferStackPos]; int pos = bufferPos[bufferStackPos]; if (pos + 1 < limit) { if (buffer[pos + 1] == '/') { // C++ comment int commentLength = 0; - while (++bufferPos[bufferStackPos] < bufferLimit[bufferStackPos]) { + while (++bufferPos[bufferStackPos] < limit) { if (buffer[bufferPos[bufferStackPos]] == '\n'||buffer[bufferPos[bufferStackPos]] == '\r') { break; } @@ -4277,10 +4283,9 @@ abstract class BaseScanner implements IScanner { } else if (buffer[pos + 1] == '*') { // C comment, find closing */ int start = pos; - for (bufferPos[bufferStackPos] += 2; bufferPos[bufferStackPos] < limit; ++bufferPos[bufferStackPos]) { + for (bufferPos[bufferStackPos] += 2; bufferPos[bufferStackPos]+1 < limit; ++bufferPos[bufferStackPos]) { pos = bufferPos[bufferStackPos]; - if (buffer[pos] == '*' && pos + 1 < limit - && buffer[pos + 1] == '/') { + if (buffer[pos] == '*' && buffer[pos + 1] == '/') { ++bufferPos[bufferStackPos]; break; }