From 5fa9743d78ad43d0241194325b174b10c954a341 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Mon, 16 May 2005 20:16:40 +0000 Subject: [PATCH] Patch for Devin Steffler. FIXED 95119- AST parser fails to parse character constant containing double quotes --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 33 +++++++++++++++++++ .../tests/ast2/DOMSelectionParseTest.java | 1 - .../core/parser/scanner2/BaseScanner.java | 21 +++++++++++- 3 files changed, 53 insertions(+), 2 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 c52b8afee3e..245dbef35bc 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 @@ -36,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.IASTInitializerList; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTNullStatement; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; @@ -3126,4 +3127,36 @@ public class AST2Tests extends AST2BaseTest { parse( buffer.toString(), ParserLanguage.C ); } + + + public void testBug95119() throws Exception { + StringBuffer buff = new StringBuffer(); + buff.append("#define MACRO(a)\n"); //$NON-NLS-1$ + buff.append("void main() {\n"); //$NON-NLS-1$ + buff.append("MACRO(\'\"\');\n"); //$NON-NLS-1$ + buff.append("}\n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buff.toString(), ParserLanguage.C); + IASTDeclaration[] declarations = tu.getDeclarations(); + assertEquals( declarations.length, 1 ); + assertNotNull( declarations[0] ); + assertTrue( declarations[0] instanceof IASTFunctionDefinition ); + assertEquals( ((IASTFunctionDefinition)declarations[0]).getDeclarator().getName().toString(), "main"); + assertTrue( ((IASTCompoundStatement)((IASTFunctionDefinition)declarations[0]).getBody()).getStatements()[0] instanceof IASTNullStatement ); + + buff = new StringBuffer(); + buff.append("#define MACRO(a)\n"); //$NON-NLS-1$ + buff.append("void main() {\n"); //$NON-NLS-1$ + buff.append("MACRO(\'X\');\n"); //$NON-NLS-1$ + buff.append("}\n"); //$NON-NLS-1$ + + tu = parse(buff.toString(), ParserLanguage.C); + declarations = tu.getDeclarations(); + assertEquals( declarations.length, 1 ); + assertNotNull( declarations[0] ); + assertTrue( declarations[0] instanceof IASTFunctionDefinition ); + assertEquals( ((IASTFunctionDefinition)declarations[0]).getDeclarator().getName().toString(), "main"); + assertTrue( ((IASTCompoundStatement)((IASTFunctionDefinition)declarations[0]).getBody()).getStatements()[0] instanceof IASTNullStatement ); + + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java index 44816a910fd..ee688698f88 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java @@ -24,7 +24,6 @@ import org.eclipse.cdt.core.dom.ast.IMacroBinding; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; 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 595cdbfd8d5..be41c531fb0 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 @@ -3732,6 +3732,25 @@ abstract class BaseScanner implements IScanner { return argEnd; } break; + // fix for 95119 + case '\'': + boolean escapedChar = false; + loop: while (++bufferPos[bufferStackPos] < bufferLimit[bufferStackPos]) { + switch (buffer[bufferPos[bufferStackPos]]) { + case '\\': + escapedChar = !escapedChar; + continue; + case '\'': + if (escapedChar) { + escapedChar = false; + continue; + } + break loop; + default: + escapedChar = false; + } + } + break; case '"': boolean escaped = false; loop: while (++bufferPos[bufferStackPos] < bufferLimit[bufferStackPos]) { @@ -3991,7 +4010,7 @@ abstract class BaseScanner implements IScanner { argend = skipOverMacroArg(); char[] arg = EMPTY_CHAR_ARRAY; - int arglen = argend - argstart + 1; + int arglen = argend - argstart + 1; // TODO Devin argend shouldn't be 65 it should be 55 for 95119 if (arglen > 0) { arg = new char[arglen]; System.arraycopy(buffer, argstart, arg, 0, arglen);