[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] FIXED 95119- AST parser fails to parse character constant containing double quotes
|
FIXED 95119- AST parser fails to parse
character constant containing double quotes
Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada
Index: parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java,v
retrieving revision 1.35
diff -u -r1.35 BaseScanner.java
--- parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java 13 May 2005 17:52:23 -0000 1.35
+++ parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java 13 May 2005 18:31:16 -0000
@@ -3729,6 +3729,25 @@
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]) {
@@ -3988,7 +4007,7 @@
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);
Index: parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java,v
retrieving revision 1.71
diff -u -r1.71 AST2Tests.java
--- parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java 13 May 2005 17:52:29 -0000 1.71
+++ parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java 13 May 2005 18:30:28 -0000
@@ -36,6 +36,7 @@
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 @@
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
Index: parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java,v
retrieving revision 1.3
diff -u -r1.3 DOMSelectionParseTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java 29 Apr 2005 00:56:08 -0000 1.3
+++ parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java 13 May 2005 18:30:29 -0000
@@ -24,7 +24,6 @@
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;