mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 14:12:10 +02:00
Fixed Bug 86274 - [Bindings] references inside typeid() don't have proper bindings
Fixed NPE in LocationMap.
This commit is contained in:
parent
5cbaa2e78d
commit
cdbad1649e
4 changed files with 69 additions and 13 deletions
|
@ -13,6 +13,7 @@
|
||||||
*/
|
*/
|
||||||
package org.eclipse.cdt.core.parser.tests.ast2;
|
package org.eclipse.cdt.core.parser.tests.ast2;
|
||||||
|
|
||||||
|
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.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;
|
||||||
|
@ -31,8 +32,10 @@ import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IArrayType;
|
import org.eclipse.cdt.core.dom.ast.IArrayType;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBasicType;
|
import org.eclipse.cdt.core.dom.ast.IBasicType;
|
||||||
|
@ -3277,6 +3280,8 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
assertEquals( expression.getInitialValue(), null );
|
assertEquals( expression.getInitialValue(), null );
|
||||||
assertEquals( expression.getSimpleType(), ICPPASTSimpleTypeConstructorExpression.t_int );
|
assertEquals( expression.getSimpleType(), ICPPASTSimpleTypeConstructorExpression.t_int );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void testBug90498_1() throws Exception {
|
public void testBug90498_1() throws Exception {
|
||||||
IASTTranslationUnit tu = parse( "typedef INT ( FOO ) (INT);", ParserLanguage.CPP ); //$NON-NLS-1$
|
IASTTranslationUnit tu = parse( "typedef INT ( FOO ) (INT);", ParserLanguage.CPP ); //$NON-NLS-1$
|
||||||
|
@ -3309,14 +3314,50 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
assertNotNull( dtor.getInitializer() );
|
assertNotNull( dtor.getInitializer() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void testBug866274() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer( "class D { /* ... */ };\n" ); //$NON-NLS-1$
|
||||||
|
buffer.append( "D d1;\n"); //$NON-NLS-1$
|
||||||
|
buffer.append( "const D d2;\n"); //$NON-NLS-1$
|
||||||
|
buffer.append( "void foo() {\n"); //$NON-NLS-1$
|
||||||
|
buffer.append( " typeid(d1) == typeid(d2);\n"); //$NON-NLS-1$
|
||||||
|
buffer.append( " typeid(D) == typeid(d2);\n"); //$NON-NLS-1$
|
||||||
|
buffer.append( "}\n"); //$NON-NLS-1$
|
||||||
|
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||||
|
IASTFunctionDefinition foo = (IASTFunctionDefinition) tu.getDeclarations()[3];
|
||||||
|
IASTCompoundStatement cs = (IASTCompoundStatement) foo.getBody();
|
||||||
|
IASTStatement [] subs = cs.getStatements();
|
||||||
|
for( int i = 0; i < subs.length; ++i )
|
||||||
|
{
|
||||||
|
IASTBinaryExpression be = (IASTBinaryExpression) ((IASTExpressionStatement)subs[i]).getExpression();
|
||||||
|
if( i == 1 )
|
||||||
|
{
|
||||||
|
IASTTypeIdExpression expression = (IASTTypeIdExpression) be.getOperand1();
|
||||||
|
IASTTypeId typeId = expression.getTypeId();
|
||||||
|
assertTrue( ((IASTNamedTypeSpecifier)typeId.getDeclSpecifier()).getName().resolveBinding() instanceof IType );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IASTUnaryExpression expression = (IASTUnaryExpression) be.getOperand1();
|
||||||
|
IASTIdExpression idExpression = (IASTIdExpression) expression.getOperand();
|
||||||
|
assertTrue( idExpression.getName().resolveBinding() instanceof IVariable );
|
||||||
|
}
|
||||||
|
IASTUnaryExpression expression = (IASTUnaryExpression) be.getOperand2();
|
||||||
|
IASTIdExpression idExpression = (IASTIdExpression) expression.getOperand();
|
||||||
|
assertTrue( idExpression.getName().resolveBinding() instanceof IVariable );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void testTypedefFunction() throws Exception {
|
public void testTypedefFunction() throws Exception {
|
||||||
IASTTranslationUnit tu = parse( "typedef int foo (int);", ParserLanguage.CPP ); //$NON-NLS-1$
|
IASTTranslationUnit tu = parse( "typedef int foo (int);", ParserLanguage.CPP ); //$NON-NLS-1$
|
||||||
CPPNameCollector col = new CPPNameCollector();
|
CPPNameCollector col = new CPPNameCollector();
|
||||||
tu.accept( col );
|
tu.accept( col );
|
||||||
|
|
||||||
IBinding binding = col.getName(0).resolveBinding();
|
IBinding binding = col.getName(0).resolveBinding();
|
||||||
assertTrue( binding instanceof ITypedef );
|
assertTrue( binding instanceof ITypedef );
|
||||||
assertTrue( ((ITypedef)binding).getType() instanceof IFunctionType );
|
assertTrue( ((ITypedef)binding).getType() instanceof IFunctionType );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,6 @@ import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
|
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
||||||
|
@ -393,7 +392,7 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
IASTBinaryExpression bexp = (IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
|
IASTBinaryExpression bexp = (IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
|
||||||
.getDeclarations()[3]).getBody()).getStatements()[0])
|
.getDeclarations()[3]).getBody()).getStatements()[0])
|
||||||
.getExpression();
|
.getExpression();
|
||||||
IASTTypeIdExpression exp = (IASTTypeIdExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
|
IASTUnaryExpression exp = (IASTUnaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
|
||||||
.getDeclarations()[3]).getBody()).getStatements()[0])
|
.getDeclarations()[3]).getBody()).getStatements()[0])
|
||||||
.getExpression()).getOperand1();
|
.getExpression()).getOperand1();
|
||||||
|
|
||||||
|
@ -402,7 +401,7 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
code.indexOf("typeid(d1) == typeid(d2)"), "typeid(d1) == typeid(d2)".length()); //$NON-NLS-1$ //$NON-NLS-2$
|
code.indexOf("typeid(d1) == typeid(d2)"), "typeid(d1) == typeid(d2)".length()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
assertSoleLocation(exp,
|
assertSoleLocation(exp,
|
||||||
code.indexOf("typeid(d1)"), "typeid(d1)".length()); //$NON-NLS-1$ //$NON-NLS-2$
|
code.indexOf("typeid(d1)"), "typeid(d1)".length()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
exp = (IASTTypeIdExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
|
exp = (IASTUnaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
|
||||||
.getDeclarations()[3]).getBody()).getStatements()[0])
|
.getDeclarations()[3]).getBody()).getStatements()[0])
|
||||||
.getExpression()).getOperand2();
|
.getExpression()).getOperand2();
|
||||||
assertSoleLocation(exp,
|
assertSoleLocation(exp,
|
||||||
|
|
|
@ -1444,10 +1444,22 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
boolean isTypeId = true;
|
boolean isTypeId = true;
|
||||||
IASTExpression lhs = null;
|
IASTExpression lhs = null;
|
||||||
IASTTypeId typeId = null;
|
IASTTypeId typeId = null;
|
||||||
|
IToken m = mark();
|
||||||
try {
|
try {
|
||||||
typeId = typeId(false, false);
|
boolean amb = false;
|
||||||
|
if ( LT(1) == IToken.tIDENTIFIER )
|
||||||
|
amb = true;
|
||||||
|
typeId = typeId(false, false);
|
||||||
|
if( amb && typeId.getDeclSpecifier() instanceof IASTNamedTypeSpecifier )
|
||||||
|
{
|
||||||
|
if( ! queryIsTypeName( ((IASTNamedTypeSpecifier) typeId.getDeclSpecifier()).getName() ) )
|
||||||
|
{
|
||||||
|
backup( m );
|
||||||
|
throwBacktrack( ((CPPASTNode)typeId).getOffset(), ((CPPASTNode)typeId).getLength() );
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (BacktrackException b) {
|
} catch (BacktrackException b) {
|
||||||
|
typeId = null;
|
||||||
isTypeId = false;
|
isTypeId = false;
|
||||||
lhs = expression();
|
lhs = expression();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1207,7 +1207,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
protected static class _FunctionMacroDefinition extends _MacroDefinition
|
protected static class _FunctionMacroDefinition extends _MacroDefinition
|
||||||
implements _IPreprocessorDirective {
|
implements _IPreprocessorDirective {
|
||||||
|
|
||||||
public final char[][] parms;
|
private final char[][] parms;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param parent
|
* @param parent
|
||||||
|
@ -1221,6 +1221,10 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
super(parent, startOffset, endOffset, name, nameOffset, expansion);
|
super(parent, startOffset, endOffset, name, nameOffset, expansion);
|
||||||
this.parms = parameters;
|
this.parms = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public char[][] getParms() {
|
||||||
|
return parms;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class _Problem extends _Context {
|
protected static class _Problem extends _Context {
|
||||||
|
@ -1351,7 +1355,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
r = new ASTObjectMacro();
|
r = new ASTObjectMacro();
|
||||||
else if (d instanceof _FunctionMacroDefinition) {
|
else if (d instanceof _FunctionMacroDefinition) {
|
||||||
IASTPreprocessorFunctionStyleMacroDefinition f = new ASTFunctionMacro();
|
IASTPreprocessorFunctionStyleMacroDefinition f = new ASTFunctionMacro();
|
||||||
char[][] parms = ((_FunctionMacroDefinition) d).parms;
|
char[][] parms = ((_FunctionMacroDefinition) d).getParms();
|
||||||
for (int j = 0; j < parms.length; ++j) {
|
for (int j = 0; j < parms.length; ++j) {
|
||||||
IASTFunctionStyleMacroParameter parm = new ASTFunctionMacroParameter();
|
IASTFunctionStyleMacroParameter parm = new ASTFunctionMacroParameter();
|
||||||
parm.setParameter(new String(parms[j]));
|
parm.setParameter(new String(parms[j]));
|
||||||
|
@ -2454,7 +2458,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMacroDefinition registerBuiltinFunctionStyleMacro(FunctionStyleMacro macro) {
|
public IMacroDefinition registerBuiltinFunctionStyleMacro(FunctionStyleMacro macro) {
|
||||||
IMacroDefinition result = new _FunctionMacroDefinition( tu, -1, -1, macro.name, -1, macro.expansion, macro.arglist );
|
IMacroDefinition result = new _FunctionMacroDefinition( tu, -1, -1, macro.name, -1, macro.expansion, removeNullArguments( macro.arglist ) );
|
||||||
tu.addBuiltinMacro( result );
|
tu.addBuiltinMacro( result );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue