1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-09 18:56:02 +02:00

Fix for 171520, node length of type-id expression

This commit is contained in:
Markus Schorn 2007-02-22 12:52:47 +00:00
parent a92749a43e
commit fe49cf75df
5 changed files with 48 additions and 19 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others. * Copyright (c) 2005, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -7,12 +7,15 @@
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
/* /*
* Created on Mar 11, 2005 * Created on Mar 11, 2005
*/ */
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
@ -68,6 +71,10 @@ public class AST2TemplateTests extends AST2BaseTest {
super(name); super(name);
} }
public static TestSuite suite() {
return suite(AST2TemplateTests.class);
}
public void testBasicClassTemplate() throws Exception { public void testBasicClassTemplate() throws Exception {
IASTTranslationUnit tu = parse( "template <class T> class A{ T t; };", ParserLanguage.CPP ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( "template <class T> class A{ T t; };", ParserLanguage.CPP ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others. * Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
@ -15,7 +16,7 @@ import java.io.Writer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
@ -68,6 +69,7 @@ import org.eclipse.cdt.core.parser.NullLogService;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser;
import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
@ -90,7 +92,7 @@ import org.eclipse.core.runtime.Platform;
/** /**
* @author jcamelon * @author jcamelon
*/ */
public class CompleteParser2Tests extends TestCase { public class CompleteParser2Tests extends BaseTestCase {
private static final NullLogService NULL_LOG = new NullLogService(); private static final NullLogService NULL_LOG = new NullLogService();
@ -100,6 +102,10 @@ public class CompleteParser2Tests extends TestCase {
super(name); super(name);
} }
public static TestSuite suite() {
return suite(CompleteParser2Tests.class);
}
static private class CPPNameCollector extends CPPASTVisitor { static private class CPPNameCollector extends CPPASTVisitor {
{ {
shouldVisitNames = true; shouldVisitNames = true;

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others. * Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -11,6 +11,8 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression; import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
@ -75,6 +77,10 @@ public class DOMLocationTests extends AST2BaseTest {
setName(name); setName(name);
} }
public static TestSuite suite() {
return suite(DOMLocationTests.class);
}
public void testBaseCase() throws ParserException { public void testBaseCase() throws ParserException {
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
: null) { : null) {
@ -671,7 +677,7 @@ public class DOMLocationTests extends AST2BaseTest {
assertSoleLocation(problems[0], buffer.indexOf("X"), "X".length() ); assertSoleLocation(problems[0], buffer.indexOf("X"), "X".length() );
} }
public void _testBug171520() throws Exception { public void testBug171520() throws Exception {
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=171520 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=171520
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
buffer.append("int i = sizeof(int);"); buffer.append("int i = sizeof(int);");

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others. * Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -28,10 +28,10 @@ public class DOMParserTestSuite extends TestCase {
suite.addTest( AST2Tests.suite() ); suite.addTest( AST2Tests.suite() );
suite.addTestSuite( GCCTests.class ); suite.addTestSuite( GCCTests.class );
suite.addTestSuite( AST2CPPTests.class ); suite.addTestSuite( AST2CPPTests.class );
suite.addTestSuite( AST2TemplateTests.class ); suite.addTest( AST2TemplateTests.suite() );
suite.addTestSuite( QuickParser2Tests.class ); suite.addTestSuite( QuickParser2Tests.class );
suite.addTestSuite( CompleteParser2Tests.class ); suite.addTest( CompleteParser2Tests.suite() );
suite.addTestSuite( DOMLocationTests.class ); suite.addTest( DOMLocationTests.suite() );
suite.addTestSuite( DOMLocationMacroTests.class ); suite.addTestSuite( DOMLocationMacroTests.class );
suite.addTest( DOMLocationInclusionTests.suite() ); suite.addTest( DOMLocationInclusionTests.suite() );
suite.addTestSuite( AST2KnRTests.class ); suite.addTestSuite( AST2KnRTests.class );

View file

@ -2080,6 +2080,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected IASTNode[] parseTypeIdOrUnaryExpression( protected IASTNode[] parseTypeIdOrUnaryExpression(
boolean typeIdWithParentheses) throws EndOfFileException { boolean typeIdWithParentheses) throws EndOfFileException {
return parseTypeIdOrUnaryExpression(typeIdWithParentheses, new int[1]);
}
protected IASTNode[] parseTypeIdOrUnaryExpression(
boolean typeIdWithParentheses, int[] endoffset) throws EndOfFileException {
IASTTypeId typeId = null; IASTTypeId typeId = null;
IASTExpression unaryExpression = null; IASTExpression unaryExpression = null;
IToken typeIdLA = null, unaryExpressionLA = null; IToken typeIdLA = null, unaryExpressionLA = null;
@ -2094,13 +2099,18 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.tRPAREN: case IToken.tRPAREN:
case IToken.tEOC: case IToken.tEOC:
consume(); endoffset[0]= consume().getEndOffset();
break; break;
default: default:
typeId = null; typeId = null;
} }
} }
if (typeId != null) typeIdLA = LA(1); if (typeId != null) {
typeIdLA = LA(1);
if (!typeIdWithParentheses) {
endoffset[0]= calculateEndOffset(typeId);
}
}
} }
} catch (BacktrackException e) { } catch (BacktrackException e) {
typeId = null; typeId = null;
@ -2123,6 +2133,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
backup(unaryExpressionLA); backup(unaryExpressionLA);
result = new IASTNode[1]; result = new IASTNode[1];
result[0] = unaryExpression; result[0] = unaryExpression;
endoffset[0]= calculateEndOffset(unaryExpression);
return result; return result;
} }
if (unaryExpression != null && typeId != null if (unaryExpression != null && typeId != null
@ -2141,27 +2152,26 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected IASTExpression parseSizeofExpression() throws BacktrackException, protected IASTExpression parseSizeofExpression() throws BacktrackException,
EndOfFileException { EndOfFileException {
int startingOffset = consume().getOffset(); // t_sizeof int startingOffset = consume().getOffset(); // t_sizeof
IASTNode[] choice = parseTypeIdOrUnaryExpression(true); int[] endoffset= new int[] {0};
IASTNode[] choice = parseTypeIdOrUnaryExpression(true, endoffset);
switch (choice.length) { switch (choice.length) {
case 1: case 1:
int lastOffset = calculateEndOffset(choice[0]);
if (choice[0] instanceof IASTExpression) if (choice[0] instanceof IASTExpression)
return buildUnaryExpression(IASTUnaryExpression.op_sizeof, return buildUnaryExpression(IASTUnaryExpression.op_sizeof,
(IASTExpression) choice[0], startingOffset, lastOffset); (IASTExpression) choice[0], startingOffset, endoffset[0]);
else if (choice[0] instanceof IASTTypeId) else if (choice[0] instanceof IASTTypeId)
return buildTypeIdExpression(IASTTypeIdExpression.op_sizeof, return buildTypeIdExpression(IASTTypeIdExpression.op_sizeof,
(IASTTypeId) choice[0], startingOffset, lastOffset); (IASTTypeId) choice[0], startingOffset, endoffset[0]);
throwBacktrack(LA(1)); throwBacktrack(LA(1));
break; break;
case 2: case 2:
lastOffset = calculateEndOffset(choice[0]);
IASTAmbiguousExpression ambExpr = createAmbiguousExpression(); IASTAmbiguousExpression ambExpr = createAmbiguousExpression();
IASTExpression e1 = buildTypeIdExpression( IASTExpression e1 = buildTypeIdExpression(
IASTTypeIdExpression.op_sizeof, (IASTTypeId) choice[0], IASTTypeIdExpression.op_sizeof, (IASTTypeId) choice[0],
startingOffset, lastOffset); startingOffset, endoffset[0]);
IASTExpression e2 = buildUnaryExpression( IASTExpression e2 = buildUnaryExpression(
IASTUnaryExpression.op_sizeof, (IASTExpression) choice[1], IASTUnaryExpression.op_sizeof, (IASTExpression) choice[1],
startingOffset, lastOffset); startingOffset, endoffset[0]);
ambExpr.addExpression(e1); ambExpr.addExpression(e1);
e1.setParent(ambExpr); e1.setParent(ambExpr);
e1.setPropertyInParent(IASTAmbiguousExpression.SUBEXPRESSION); e1.setPropertyInParent(IASTAmbiguousExpression.SUBEXPRESSION);