Skip to main content

[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;

Back to the top