[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Expression Result Evaluation + tests
|
Core:
In
completeParseASTFactory.getExpressionResultType()
-
Added the handling of some more _expression_ types.
See
CompleteParseASTExpressionTest for details.
Tests:
- Added lots of test
cases to CompleteParseASTExpressionTest
Hoda Amer
Staff Software Engineer
Rational Software - IBM Software Group
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.124
diff -u -r1.124 ChangeLog
--- parser/ChangeLog 12 Sep 2003 19:11:18 -0000 1.124
+++ parser/ChangeLog 12 Sep 2003 20:47:07 -0000
@@ -1,3 +1,8 @@
+2003-09-12 Hoda Amer
+ In completeParseASTFactory.getExpressionResultType()
+ - Added the handling of some more expression types.
+ See CompleteParseASTExpressionTest for details.
+
2003-09-12 John Camelon
Fixed Bug 42985 : Search: Qualified function call is treated as a declaration
Fixed Bug 40419 : parser fails on heavily templated expressions
Index: parser/org/eclipse/cdt/core/parser/ast/IASTExpression.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTExpression.java,v
retrieving revision 1.7
diff -u -r1.7 IASTExpression.java
--- parser/org/eclipse/cdt/core/parser/ast/IASTExpression.java 4 Sep 2003 14:39:15 -0000 1.7
+++ parser/org/eclipse/cdt/core/parser/ast/IASTExpression.java 12 Sep 2003 20:47:07 -0000
@@ -95,8 +95,7 @@
public static final Kind INCLUSIVEOREXPRESSION = new Kind( 68 );
public static final Kind LOGICALANDEXPRESSION = new Kind( 69 );
public static final Kind LOGICALOREXPRESSION = new Kind( 70 );
- public static final Kind CONDITIONALEXPRESSION_SIMPLE = new Kind( 71 );
- public static final Kind CONDITIONALEXPRESSION_HARD = new Kind( 72 );
+ public static final Kind CONDITIONALEXPRESSION = new Kind( 71 );
public static final Kind THROWEXPRESSION = new Kind( 72 );
public static final Kind ASSIGNMENTEXPRESSION_NORMAL = new Kind( 73 );
public static final Kind ASSIGNMENTEXPRESSION_PLUS = new Kind( 74 );
Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
retrieving revision 1.108
diff -u -r1.108 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java 12 Sep 2003 19:11:18 -0000 1.108
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java 12 Sep 2003 20:47:08 -0000
@@ -2893,7 +2893,7 @@
// if the condition not taken, try assignment operators
if (conditionalExpression != null
&& conditionalExpression.getExpressionKind()
- == IASTExpression.Kind.CONDITIONALEXPRESSION_HARD)
+ == IASTExpression.Kind.CONDITIONALEXPRESSION)
return conditionalExpression;
switch (LT(1)) {
case IToken.tASSIGN :
@@ -3031,7 +3031,7 @@
{
return astFactory.createExpression(
scope,
- IASTExpression.Kind.CONDITIONALEXPRESSION_HARD,
+ IASTExpression.Kind.CONDITIONALEXPRESSION,
firstExpression,
secondExpression,
thirdExpression,
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java,v
retrieving revision 1.36
diff -u -r1.36 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 12 Sep 2003 18:36:36 -0000 1.36
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 12 Sep 2003 20:47:09 -0000
@@ -767,6 +767,15 @@
if( typeId != null ){
symbol = lookupQualifiedName( startingScope, typeId, references, false );
}
+ // "a.m" or "a->m : lookup m in the scope of the declaration of a
+ if ((kind == IASTExpression.Kind.POSTFIX_DOT_IDEXPRESSION)
+ || (kind == IASTExpression.Kind.POSTFIX_ARROW_IDEXPRESSION)){
+ TypeInfo lhsInfo = (TypeInfo) ((ASTExpression)lhs).getResultType().iterator().next();
+ ISymbol containingScope = (ISymbol) lhsInfo.getTypeSymbol().getTypeSymbol();
+ if(containingScope != null){
+ symbol = lookupQualifiedName((IContainerSymbol)containingScope, ((ASTExpression)rhs).getTypeId() , references, false);
+ }
+ }
if (kind == IASTExpression.Kind.POSTFIX_FUNCTIONCALL){
ITokenDuple functionId = ((ASTExpression)lhs).getTypeId();
@@ -781,7 +790,72 @@
return expression;
}
-
+ /*
+ * Apply the usual arithmetic conversions to find out the result of an expression
+ * that has a lhs and a rhs as indicated in the specs (section 5.Expressions, page 64)
+ */
+ protected TypeInfo usualArithmeticConversions(TypeInfo lhs, TypeInfo rhs){
+ TypeInfo info = new TypeInfo();
+ if(
+ ( lhs.checkBit(TypeInfo.isLong) && lhs.getType() == TypeInfo.t_double)
+ || ( rhs.checkBit(TypeInfo.isLong) && rhs.getType() == TypeInfo.t_double)
+ ){
+ info.setType(TypeInfo.t_double);
+ info.setBit(true, TypeInfo.isLong);
+ return info;
+ }
+ else if(
+ ( lhs.getType() == TypeInfo.t_double )
+ || ( rhs.getType() == TypeInfo.t_double )
+ ){
+ info.setType(TypeInfo.t_double);
+ return info;
+ }
+ else if (
+ ( lhs.getType() == TypeInfo.t_float )
+ || ( rhs.getType() == TypeInfo.t_float )
+ ){
+ info.setType(TypeInfo.t_float);
+ return info;
+ } else {
+ // perform intergral promotions (Specs section 4.5)
+ info.setType(TypeInfo.t_int);
+ }
+
+ if(
+ ( lhs.checkBit(TypeInfo.isUnsigned) && lhs.checkBit(TypeInfo.isLong))
+ || ( rhs.checkBit(TypeInfo.isUnsigned) && rhs.checkBit(TypeInfo.isLong))
+ ){
+ info.setBit(true, TypeInfo.isUnsigned);
+ info.setBit(true, TypeInfo.isLong);
+ return info;
+ }
+ else if(
+ ( lhs.checkBit(TypeInfo.isUnsigned) && rhs.checkBit(TypeInfo.isLong) )
+ || ( rhs.checkBit(TypeInfo.isUnsigned) && lhs.checkBit(TypeInfo.isLong) )
+ ){
+ info.setBit(true, TypeInfo.isUnsigned);
+ info.setBit(true, TypeInfo.isLong);
+ return info;
+ }
+ else if (
+ ( lhs.checkBit(TypeInfo.isLong))
+ || ( rhs.checkBit(TypeInfo.isLong))
+ ){
+ info.setBit(true, TypeInfo.isLong);
+ return info;
+ }
+ else if (
+ ( lhs.checkBit(TypeInfo.isUnsigned) )
+ || ( rhs.checkBit(TypeInfo.isUnsigned) )
+ ){
+ info.setBit(true, TypeInfo.isUnsigned);
+ return info;
+ } else {
+ // it should be both = int
+ return info;
+ }
+ }
protected List getExpressionResultType(IASTExpression expression, ISymbol symbol){
List result = new ArrayList();
TypeInfo info = new TypeInfo();
@@ -794,25 +868,22 @@
return result;
}
// types that resolve to int
- // the relational kinds are 0 and !0
if ((expression.getExpressionKind() == IASTExpression.Kind.PRIMARY_INTEGER_LITERAL)
|| (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SIMPLETYPE_INT)
- || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_GREATERTHAN)
- || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_GREATERTHANEQUALTO)
- || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_LESSTHAN)
- || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_LESSTHANEQUALTO)
- || (expression.getExpressionKind() == IASTExpression.Kind.EQUALITY_EQUALS)
- || (expression.getExpressionKind() == IASTExpression.Kind.EQUALITY_NOTEQUALS)
- || (expression.getExpressionKind() == IASTExpression.Kind.ANDEXPRESSION)
- || (expression.getExpressionKind() == IASTExpression.Kind.EXCLUSIVEOREXPRESSION)
- || (expression.getExpressionKind() == IASTExpression.Kind.INCLUSIVEOREXPRESSION)
- || (expression.getExpressionKind() == IASTExpression.Kind.LOGICALANDEXPRESSION)
- || (expression.getExpressionKind() == IASTExpression.Kind.LOGICALOREXPRESSION)
){
info.setType(TypeInfo.t_int);
result.add(info);
return result;
}
+ // size of is always unsigned int
+ if ((expression.getExpressionKind() == IASTExpression.Kind.UNARY_SIZEOF_TYPEID)
+ || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_SIZEOF_UNARYEXPRESSION)
+ ){
+ info.setType(TypeInfo.t_int);
+ info.setBit(true, TypeInfo.isUnsigned);
+ result.add(info);
+ return result;
+ }
// types that resolve to char
if( (expression.getExpressionKind() == IASTExpression.Kind.PRIMARY_CHAR_LITERAL)
|| (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SIMPLETYPE_CHAR)){
@@ -849,6 +920,14 @@
// types that resolve to bool
if( (expression.getExpressionKind() == IASTExpression.Kind.PRIMARY_BOOLEAN_LITERAL)
|| (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SIMPLETYPE_BOOL)
+ || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_GREATERTHAN)
+ || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_GREATERTHANEQUALTO)
+ || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_LESSTHAN)
+ || (expression.getExpressionKind() == IASTExpression.Kind.RELATIONAL_LESSTHANEQUALTO)
+ || (expression.getExpressionKind() == IASTExpression.Kind.EQUALITY_EQUALS)
+ || (expression.getExpressionKind() == IASTExpression.Kind.EQUALITY_NOTEQUALS)
+ || (expression.getExpressionKind() == IASTExpression.Kind.LOGICALANDEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.LOGICALOREXPRESSION)
)
{
info.setType(TypeInfo.t_bool);
@@ -885,7 +964,9 @@
}
// types that resolve to t_type, symbol already looked up in type id
- if (expression.getExpressionKind() == IASTExpression.Kind.ID_EXPRESSION){
+ if( (expression.getExpressionKind() == IASTExpression.Kind.ID_EXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_TYPEID_TYPEID)
+ ){
info.setType(TypeInfo.t_type);
if(symbol != null)
info.setTypeSymbol(symbol);
@@ -914,16 +995,64 @@
result.add(info);
return result;
}
- // types that resolve to LHS types
- if ((expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_INCREMENT)
- || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DECREMENT)
- || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_INCREMENT)
- || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_DECREMENT)
- || (expression.getExpressionKind() == IASTExpression.Kind.MULTIPLICATIVE_MULTIPLY)
+ // the dot and the arrow resolves to the type of the member
+ if ((expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DOT_IDEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_ARROW_IDEXPRESSION)
+ ){
+ if(symbol != null){
+ info = new TypeInfo(symbol.getTypeInfo());
+ result.add(info);
+ return result;
+ }
+ }
+ // new
+/* if((expression.getExpressionKind() == IASTExpression.Kind.NEW_NEWTYPEID)
+ || (expression.getExpressionKind() == IASTExpression.Kind.NEW_TYPEID)
+ ){
+ if(symbol != null){
+ info.setType(symbol.getType());
+ info.setTypeSymbol(symbol);
+ result.add(info);
+ return result;
+ }
+ }
+*/ // types that use the usual arithmetic conversions
+ if((expression.getExpressionKind() == IASTExpression.Kind.MULTIPLICATIVE_MULTIPLY)
|| (expression.getExpressionKind() == IASTExpression.Kind.MULTIPLICATIVE_DIVIDE)
|| (expression.getExpressionKind() == IASTExpression.Kind.MULTIPLICATIVE_MODULUS)
|| (expression.getExpressionKind() == IASTExpression.Kind.ADDITIVE_PLUS)
|| (expression.getExpressionKind() == IASTExpression.Kind.ADDITIVE_MINUS)
+ || (expression.getExpressionKind() == IASTExpression.Kind.ANDEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.EXCLUSIVEOREXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.INCLUSIVEOREXPRESSION)
+ ){
+ ASTExpression left = (ASTExpression)expression.getLHSExpression();
+ ASTExpression right = (ASTExpression)expression.getRHSExpression();
+ if((left != null ) && (right != null)){
+ TypeInfo leftType =(TypeInfo)left.getResultType().iterator().next();
+ while( (leftType.getType() == TypeInfo.t_type) && (leftType.getTypeSymbol() != null)){
+ leftType = leftType.getTypeSymbol().getTypeInfo();
+ }
+ TypeInfo rightType =(TypeInfo)right.getResultType().iterator().next();
+ while( (rightType.getType() == TypeInfo.t_type) && (rightType.getTypeSymbol() != null)){
+ rightType = rightType.getTypeSymbol().getTypeInfo();
+ }
+ info = usualArithmeticConversions(leftType, rightType);
+ result.add(info);
+ return result;
+ }
+ }
+ // types that resolve to LHS types
+ if ((expression.getExpressionKind() == IASTExpression.Kind.PRIMARY_BRACKETED_EXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_INCREMENT)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DECREMENT)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_TYPEID_EXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_INCREMENT)
+ || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_DECREMENT)
+ || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_PLUS_CASTEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_MINUS_CASTEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_NOT_CASTEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.UNARY_TILDE_CASTEXPRESSION)
|| (expression.getExpressionKind() == IASTExpression.Kind.SHIFT_LEFT)
|| (expression.getExpressionKind() == IASTExpression.Kind.SHIFT_RIGHT)
|| (expression.getExpressionKind() == IASTExpression.Kind.ASSIGNMENTEXPRESSION_NORMAL)
@@ -945,6 +1074,20 @@
return result;
}
}
+ // the cast changes the types to the type looked up in typeId = symbol
+ if((expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DYNAMIC_CAST)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_REINTERPRET_CAST)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_STATIC_CAST)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_CONST_CAST)
+ ){
+ if(symbol != null){
+ info = new TypeInfo(symbol.getTypeInfo());
+ info.setTypeSymbol(symbol);
+ result.add(info);
+ return result;
+ }
+ }
+
// a list collects all types of left and right hand sides
if(expression.getExpressionKind() == IASTExpression.Kind.EXPRESSIONLIST){
if(expression.getLHSExpression() != null){
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/ChangeLog,v
retrieving revision 1.93
diff -u -r1.93 ChangeLog
--- ChangeLog 12 Sep 2003 19:11:22 -0000 1.93
+++ ChangeLog 12 Sep 2003 20:47:48 -0000
@@ -1,3 +1,6 @@
+2003-09-12 Hoda Amer
+ - Added lots of test cases to CompleteParseASTExpressionTest
+
2003-09-12 John Camelon
Created QuickParseASTTests::testBug42985().
Moved LokiFailures::testBug40419() to QuickParseASTTests.
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java,v
retrieving revision 1.2
diff -u -r1.2 CompleteParseASTExpressionTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java 10 Sep 2003 13:21:53 -0000 1.2
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java 12 Sep 2003 20:47:48 -0000
@@ -15,6 +15,8 @@
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTClassReference;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
+import org.eclipse.cdt.core.parser.ast.IASTField;
+import org.eclipse.cdt.core.parser.ast.IASTFieldReference;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTFunctionReference;
import org.eclipse.cdt.core.parser.ast.IASTReference;
@@ -33,8 +35,20 @@
{
super(a);
}
- // IASTExpression.Kind.PRIMARY_INTEGER_LITERAL
- public void testExpressionResultValueWithSimpleTypes1() throws Exception
+ // Kind PRIMARY_EMPTY : void
+ public void testPrimaryEmpty() throws Exception
+ {
+ Iterator i = parse ("int f(char); \n int f(void); \n int x = f();").getDeclarations();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ IASTFunctionReference fr1 = (IASTFunctionReference) references.next();
+ assertEquals( fr1.getReferencedElement(), f2 );
+
+ }
+ // Kind PRIMARY_INTEGER_LITERAL : int
+ public void testPrimaryIntegerLiteral() throws Exception
{
Iterator i = parse ("int f(int, int); \n int f(int); \n int x = f(1, 2+3);").getDeclarations();
IASTFunction f1 = (IASTFunction) i.next();
@@ -45,8 +59,8 @@
assertEquals( fr1.getReferencedElement(), f1 );
}
- // IASTExpression.Kind.PRIMARY_CHAR_LITERAL
- public void testExpressionResultValueWithSimpleTypes2() throws Exception
+ // Kind PRIMARY_CHAR_LITERAL : char
+ public void testPrimaryCharLiteral() throws Exception
{
Iterator i = parse ("int f(char, int); \n int f(char); \n int x = f('c');").getDeclarations();
IASTFunction f1 = (IASTFunction) i.next();
@@ -57,8 +71,8 @@
assertEquals( fr1.getReferencedElement(), f2 );
}
- // IASTExpression.Kind.PRIMARY_FLOAT_LITERAL
- public void testExpressionResultValueWithSimpleTypes3() throws Exception
+ // Kind PRIMARY_FLOAT_LITERAL : float
+ public void testPrimaryFloatLiteral() throws Exception
{
Iterator i = parse ("int f(char); \n int f(float); \n int x = f(1.13);").getDeclarations();
IASTFunction f1 = (IASTFunction) i.next();
@@ -69,8 +83,8 @@
assertEquals( fr1.getReferencedElement(), f2 );
}
- // IASTExpression.Kind.PRIMARY_STRING_LITERAL
- public void testExpressionResultValueWithSimpleTypes4() throws Exception
+ // Kind PRIMARY_STRING_LITERAL : char*
+ public void testPrimaryStringLiteral() throws Exception
{
Iterator i = parse ("int f(char); \n int f(char*); \n int x = f(\"str\");").getDeclarations();
IASTFunction f1 = (IASTFunction) i.next();
@@ -81,8 +95,8 @@
assertEquals( fr1.getReferencedElement(), f2 );
}
- // IASTExpression.Kind.PRIMARY_BOOLEAN_LITERAL
- public void testExpressionResultValueWithSimpleTypes5() throws Exception
+ // Kind PRIMARY_BOOLEAN_LITERAL : bool
+ public void testPrimaryBooleanLiteral() throws Exception
{
Iterator i = parse ("int f(bool); \n int f(float); \n int x = f(true);").getDeclarations();
IASTFunction f1 = (IASTFunction) i.next();
@@ -92,21 +106,22 @@
IASTFunctionReference fr1 = (IASTFunctionReference) references.next();
assertEquals( fr1.getReferencedElement(), f1 );
- }
- // IASTExpression.Kind.PRIMARY_EMPTY
- public void testExpressionResultValueWithSimpleTypes6() throws Exception
+ }
+ // Kind PRIMARY_THIS
+
+ // Kind PRIMARY_BRACKETED_EXPRESSION : LHS
+ public void testPrimaryBracketedExpression() throws Exception
{
- Iterator i = parse ("int f(char); \n int f(void); \n int x = f();").getDeclarations();
+ Iterator i = parse ("int f(int, int); \n int f(int); \n int x = f(1, (2+3));").getDeclarations();
IASTFunction f1 = (IASTFunction) i.next();
IASTFunction f2 = (IASTFunction) i.next();
IASTVariable x = (IASTVariable) i.next();
Iterator references = callback.getReferences().iterator();
IASTFunctionReference fr1 = (IASTFunctionReference) references.next();
- assertEquals( fr1.getReferencedElement(), f2 );
-
- }
- // IASTExpression.Kind.ID_EXPRESSION
- public void testExpressionResultValueWithReferenceTypes() throws Exception
+ assertEquals( fr1.getReferencedElement(), f1 );
+ }
+ // Kind ID_EXPRESSION : type of the ID
+ public void testIdExpression() throws Exception
{
Iterator i = parse ("class A{}a; \n int f(A a); \n int f(void); \n int x = f(a);").getDeclarations();
IASTVariable a = (IASTVariable) i.next();
@@ -120,10 +135,10 @@
assertEquals( ar1.getReferencedElement(), a );
assertEquals( fr1.getReferencedElement(), f1 );
}
- // IASTExpression.Kind.UNARY_STAR_CASTEXPRESSION
- public void testExpressionResultValueWithReferenceTypesAndPointers1() throws Exception
+ // Kind ID_EXPRESSION ( refers to a pointer ) : pointer to type of ID
+ public void testIdExpressionToPointer() throws Exception
{
- Iterator i = parse ("class A {}; \n A * pa; \n int f(A ia){} \n int f(void); \n int x = f(*pa);").getDeclarations();
+ Iterator i = parse ("class A {}; \n A * pa; \n int f(A *ia){} \n int f(void); \n int x = f(pa);").getDeclarations();
IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTVariable a = (IASTVariable) i.next();
IASTFunction f1 = (IASTFunction) i.next();
@@ -137,12 +152,213 @@
assertEquals( clr1.getReferencedElement(), cl );
assertEquals( ar1.getReferencedElement(), a );
assertEquals( fr1.getReferencedElement(), f1 );
+ }
+ // Kind POSTFIX_SUBSCRIPT
+
+ // Kind POSTFIX_FUNCTIONCALL : return type of called function
+ public void testPostfixFunctioncallBug42822() throws Exception
+ {
+ Iterator i = parse( "int foo( float b ); int bar( int a, int b ); int test( void ) { int x = bar( foo( 3.0 ), foo( 5.0 ) ) ; }").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction bar = (IASTFunction)i.next();
+ IASTFunction test = (IASTFunction)i.next();
+ assertFalse( i.hasNext() );
+ Iterator references = callback.getReferences().iterator();
+ //THIS SHOULD BE 3, 2 references of foo(), one reference of bar()
+ assertEquals( callback.getReferences().size(), 3 );
+ }
+ // Kind POSTFIX_SIMPLETYPE_* : simple type
+ public void testPostfixSimpletypesBug42823() throws Exception
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append( "void foo( int anInt, short aShort, double aDouble, float aFloat, char aChar, wchar_t aWchar, signed aSigned, unsigned anUnsigned, bool aBool, long aLong );");
+ buffer.append( "void test( void ) { int someInt = foo( int(3), short(4), double(3.0), float(4.0), char( 'a'), wchar_t( 'a' ), signed( 2 ), unsigned( 3 ), bool( false ), long( 3L ) ); }");
+ Iterator i = parse( buffer.toString() ).getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction test = (IASTFunction)i.next();
+ assertFalse( i.hasNext() );
+ Iterator references = callback.getReferences().iterator();
+ //should be 1
+ assertEquals( callback.getReferences().size(), 1 );
+ }
+ // Kind POSTFIX_TYPENAME_IDENTIFIER
+
+ // Kind POSTFIX_TYPENAME_TEMPLATEID
+
+ // Kind POSTFIX_DOT_IDEXPRESSION : type of member in the scope of the container
+ public void testPostfixDotExpression() throws Exception{
+ Iterator i = parse( "class A {int m;}; \n A a; \n int foo(char); int foo( int ); \n int x = foo( a.m );").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTVariable a = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator members = getDeclarations(cl);
+ IASTField m = (IASTField)members.next();
+ Iterator references = callback.getReferences().iterator();
+ IASTClassReference clr= (IASTClassReference)references.next();
+ assertEquals(clr.getReferencedElement(), cl);
+ IASTVariableReference ar = (IASTVariableReference)references.next();
+ assertEquals(ar.getReferencedElement(), a);
+ IASTFieldReference mr = (IASTFieldReference) references.next();
+ assertEquals(mr.getReferencedElement(), m);
+ IASTFunctionReference fr = (IASTFunctionReference) references.next();
+ assertEquals(fr.getReferencedElement(), f2);
+ }
+ // Kind POSTFIX_ARROW_IDEXPRESSION : type of member in the scope of the container
+ public void testPostfixArrowExpression() throws Exception{
+ Iterator i = parse( "class A {int m;}; \n A * a; \n int foo(char); int foo( int ); \n int x = foo( a->m );").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTVariable a = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator members = getDeclarations(cl);
+ IASTField m = (IASTField)members.next();
+ Iterator references = callback.getReferences().iterator();
+ IASTClassReference clr= (IASTClassReference)references.next();
+ assertEquals(clr.getReferencedElement(), cl);
+ IASTVariableReference ar = (IASTVariableReference)references.next();
+ assertEquals(ar.getReferencedElement(), a);
+ IASTFieldReference mr = (IASTFieldReference) references.next();
+ assertEquals(mr.getReferencedElement(), m);
+ IASTFunctionReference fr = (IASTFunctionReference) references.next();
+ assertEquals(fr.getReferencedElement(), f2);
+ }
+ // Kind POSTFIX_DOT_TEMPL_IDEXPRESS
+ // Kind POSTFIX_ARROW_TEMPL_IDEXP
+ // Kind POSTFIX_DOT_DESTRUCTOR
+ // Kind POSTFIX_ARROW_DESTRUCTOR
+
+ // Kind POSTFIX_INCREMENT : LHS
+ public void testPostfixIncrement() throws Exception
+ {
+ Iterator i = parse( "void foo(); int foo( int ); void test( void ) { int x = 5; int y = foo( x++ ); } ").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTFunction test = (IASTFunction)i.next();
+ Iterator subDecls = getDeclarations( test );
+ IASTVariable x = (IASTVariable)subDecls.next();
+ IASTVariable y = (IASTVariable)subDecls.next();
+ assertFalse( subDecls.hasNext() );
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), x );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); // should be foo2
+ assertFalse( references.hasNext() );
+ }
+ // Kind POSTFIX_DECREMENT : LHS
+ public void testPostfixDecrement() throws Exception
+ {
+ Iterator i = parse( "void foo(); int foo( int ); void test( void ) { int x = 5; int y = foo( x-- ); } ").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTFunction test = (IASTFunction)i.next();
+ Iterator subDecls = getDeclarations( test );
+ IASTVariable x = (IASTVariable)subDecls.next();
+ IASTVariable y = (IASTVariable)subDecls.next();
+ assertFalse( subDecls.hasNext() );
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), x );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); // should be foo2
+ assertFalse( references.hasNext() );
+ }
+
+ // Kind POSTFIX_DYNAMIC_CAST
+/* public void testPostfixDynamicCast() throws Exception{
+ Iterator i = parse( "class A {}; class B : public A{}; \n B * b; \n int foo(); int foo( A* ); \n int x = foo( dynamic_cast<A*>(b) );").getDeclarations();
+ IASTClassSpecifier cla = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTClassSpecifier clb = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTVariable b = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals(((IASTClassReference)references.next()).getReferencedElement(), cla);
+ assertEquals(((IASTClassReference)references.next()).getReferencedElement(), clb);
+ assertEquals(((IASTClassReference)references.next()).getReferencedElement(), cla);
+ assertEquals(((IASTClassReference)references.next()).getReferencedElement(), b);
+ assertEquals(((IASTClassReference)references.next()).getReferencedElement(), cla);
+ assertEquals(((IASTClassReference)references.next()).getReferencedElement(), f2);
+ }
+*/
+ // Kind POSTFIX_REINTERPRET_CAST
+ // Kind POSTFIX_STATIC_CAST
+ // Kind POSTFIX_CONST_CAST
+
+ // Kind POSTFIX_TYPEID_EXPRESSION : LHS
+ public void testPostfixTypeIdExpression() throws Exception{
+ Iterator i = parse( "int foo(char); int foo( int ); \n int x = foo( typeid(5) );").getDeclarations();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ IASTFunctionReference fr = (IASTFunctionReference) references.next();
+ assertEquals(fr.getReferencedElement(), f2);
}
- // IASTExpression.Kind.ID_EXPRESSION ( refers to a pointer )
- public void testExpressionResultValueWithReferenceTypesAndPointers2() throws Exception
+ // Kind POSTFIX_TYPEID_TYPEID : type of the ID
+ public void testPostfixTypeIdTypeId() throws Exception{
+ Iterator i = parse( "class A {}; \n A a; \n int foo(A); int foo( int ); \n int x = foo( typeid(a) );").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTVariable a = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ IASTClassReference clr= (IASTClassReference)references.next();
+ assertEquals(clr.getReferencedElement(), cl);
+ IASTClassReference clr2= (IASTClassReference)references.next();
+ assertEquals(clr2.getReferencedElement(), cl);
+ IASTVariableReference ar = (IASTVariableReference)references.next();
+ assertEquals(ar.getReferencedElement(), a);
+ IASTFunctionReference fr = (IASTFunctionReference) references.next();
+ assertEquals(fr.getReferencedElement(), f1);
+
+ }
+ // Kind UNARY_INCREMENT : LHS
+ public void testUnaryIncrement() throws Exception
{
- Iterator i = parse ("class A {}; \n A * pa; \n int f(A *ia){} \n int f(void); \n int x = f(pa);").getDeclarations();
+ Iterator i = parse( "void foo(); int foo( int ); void test( void ) { int x = 5; int y = foo( ++x ); } ").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTFunction test = (IASTFunction)i.next();
+ Iterator subDecls = getDeclarations( test );
+ IASTVariable x = (IASTVariable)subDecls.next();
+ IASTVariable y = (IASTVariable)subDecls.next();
+ assertFalse( subDecls.hasNext() );
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), x );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); // should be foo2
+ assertFalse( references.hasNext() );
+ }
+ // Kind UNARY_DECREMENT : LHS
+ public void testUnaryDecrement() throws Exception
+ {
+ Iterator i = parse( "void foo(); int foo( int ); void test( void ) { int x = 5; int y = foo( --x ); } ").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTFunction test = (IASTFunction)i.next();
+ Iterator subDecls = getDeclarations( test );
+ IASTVariable x = (IASTVariable)subDecls.next();
+ IASTVariable y = (IASTVariable)subDecls.next();
+ assertFalse( subDecls.hasNext() );
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), x );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); // should be foo2
+ assertFalse( references.hasNext() );
+ }
+ // Kind UNARY_STAR_CASTEXPRESSION : LHS + t_pointer
+ public void testUnaryStarCastExpression() throws Exception
+ {
+ Iterator i = parse ("class A {}; \n A * pa; \n int f(A ia){} \n int f(void); \n int x = f(*pa);").getDeclarations();
IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTVariable a = (IASTVariable) i.next();
IASTFunction f1 = (IASTFunction) i.next();
@@ -156,9 +372,10 @@
assertEquals( clr1.getReferencedElement(), cl );
assertEquals( ar1.getReferencedElement(), a );
assertEquals( fr1.getReferencedElement(), f1 );
+
}
- // IASTExpression.Kind.UNARY_AMPSND_CASTEXPRESSION
- public void testExpressionResultValueWithReferenceTypesAndPointers3() throws Exception
+ // Kind UNARY_AMPSND_CASTEXPRESSION : LHS + t_reference
+ public void testUnaryAmpersandCastExpression() throws Exception
{
Iterator i = parse ("class A {}; \n A * pa; \n int f(A ** ia){} \n int f(void); \n int x = f(&pa);").getDeclarations();
IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
@@ -175,51 +392,543 @@
assertEquals( ar1.getReferencedElement(), a );
assertEquals( fr1.getReferencedElement(), f1 );
}
- // IASTExpression.Kind.POSTFIX_FUNCTIONCALL
- public void testBug42822() throws Exception
- {
- Iterator i = parse( "int foo( float b ); int bar( int a, int b ); int test( void ) { int x = bar( foo( 3.0 ), foo( 5.0 ) ) ; }").getDeclarations();
- IASTFunction foo = (IASTFunction)i.next();
- IASTFunction bar = (IASTFunction)i.next();
- IASTFunction test = (IASTFunction)i.next();
+ // Kind UNARY_PLUS_CASTEXPRESSION : LHS
+ public void testUnaryPlusCastExpression() throws Exception {
+ Iterator i = parse( "void foo(); int foo( int ); int x = foo( +5 );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable x = (IASTVariable)i.next();
assertFalse( i.hasNext() );
- Iterator references = callback.getReferences().iterator();
- //THIS SHOULD BE 3, 2 references of foo(), one reference of bar()
- assertEquals( callback.getReferences().size(), 3 );
+ assertEquals( callback.getReferences().size(), 1 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
}
-
- // IASTExpression.Kind.POSTFIX_SIMPLETYPE_*
- public void testBug42823() throws Exception
- {
- StringBuffer buffer = new StringBuffer();
- buffer.append( "void foo( int anInt, short aShort, double aDouble, float aFloat, char aChar, wchar_t aWchar, signed aSigned, unsigned anUnsigned, bool aBool, long aLong );");
- buffer.append( "void test( void ) { int someInt = foo( int(3), short(4), double(3.0), float(4.0), char( 'a'), wchar_t( 'a' ), signed( 2 ), unsigned( 3 ), bool( false ), long( 3L ) ); }");
- Iterator i = parse( buffer.toString() ).getDeclarations();
+ // Kind UNARY_MINUS_CASTEXPRESSION : LHS
+ public void testUnaryMinusCastExpression() throws Exception {
+ Iterator i = parse( "void foo(); int foo( int ); int x = foo( -5 );").getDeclarations();
IASTFunction foo = (IASTFunction)i.next();
- IASTFunction test = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable x = (IASTVariable)i.next();
assertFalse( i.hasNext() );
- Iterator references = callback.getReferences().iterator();
- //should be 1
- assertEquals( callback.getReferences().size(), 1 );
+ assertEquals( callback.getReferences().size(), 1 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
}
-
- // IASTExpression.Kind.POSTFIX_INCREMENT
- public void testBug42822B() throws Exception
- {
- Iterator i = parse( "void foo(); int foo( int ); void test( void ) { int x = 5; int y = foo( x++ ); } ").getDeclarations();
+ // Kind UNARY_NOT_CASTEXPRESSION : LHS
+ public void testUnaryNotCastExpression() throws Exception {
+ Iterator i = parse( "void foo(); int foo( bool ); bool b=true; int x = foo( !b );").getDeclarations();
IASTFunction foo = (IASTFunction)i.next();
IASTFunction foo2 = (IASTFunction)i.next();
- IASTFunction test = (IASTFunction)i.next();
- Iterator subDecls = getDeclarations( test );
- IASTVariable x = (IASTVariable)subDecls.next();
- IASTVariable y = (IASTVariable)subDecls.next();
- assertFalse( subDecls.hasNext() );
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind UNARY_TILDE_CASTEXPRESSION : LHS
+ public void testTildeNotCastExpression() throws Exception {
+ Iterator i = parse( "void foo(); int foo( int ); int x = 5; int y = foo( ~x );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ IASTVariable y = (IASTVariable)i.next();
assertFalse( i.hasNext() );
assertEquals( callback.getReferences().size(), 2 );
Iterator references =callback.getReferences().iterator();
assertEquals( ((IASTReference)references.next()).getReferencedElement(), x );
- assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); // should be foo2
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind UNARY_SIZEOF_UNARYEXPRESSION : unsigned int
+ public void testUnarySizeofUnaryExpression() throws Exception {
+ Iterator i = parse( "void foo(); int foo( int ); int x = 5; int y = foo( sizeof(5) );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ IASTVariable y = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 1 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind UNARY_SIZEOF_TYPEID : unsigned int
+ public void testUnarySizeofTypeId() throws Exception {
+ Iterator i = parse( "void foo(); int foo( int ); int x = 5; int y = foo( sizeof(x) );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ IASTVariable y = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), x );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
assertFalse( references.hasNext() );
}
+ // Kind NEW_NEWTYPEID
+ // Kind NEW_TYPEID
+ // There are so many ways to call new, only this case is handeled.
+/* public void testNewTypeId() throws Exception {
+ Iterator i = parse( "class A{}; void foo(); int foo( A a ); int x = foo( new A() );").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ //assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ IASTClassReference clr1 = (IASTClassReference) references.next();
+ IASTClassReference clr2 = (IASTClassReference) references.next();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+*/
+ // Kind DELETE_CASTEXPRESSION
+ // Kind DELETE_VECTORCASTEXPRESSION
+ // Kind CASTEXPRESSION
+ // Kind PM_DOTSTAR
+ // Kind PM_ARROWSTAR
+
+ // Kind MULTIPLICATIVE_MULTIPLY : usual arithmetic conversions
+ public void testMultiplicativeMultiply() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( float ); int a = 3; float b=5.1 ; int x = foo( a * b );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind MULTIPLICATIVE_DIVIDE : usual arithmetic conversions
+ public void testMultiplicativeDivide() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( float ); int a = 3; float b=5.1 ; int x = foo( b / a );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind MULTIPLICATIVE_MODULUS : usual arithmetic conversions
+ public void testMultiplicativeModulus() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( float ); int a = 3; float b=5.1 ; int x = foo( b % a );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ADDITIVE_PLUS : usual arithmetic conversions
+ public void testAdditivePlus() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( float ); int a = 3; float b=5.1 ; int x = foo( b + a );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ADDITIVE_MINUS : usual arithmetic conversions
+ public void testAdditiveMinus() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( float ); int a = 3; float b=5.1 ; int x = foo( b - a );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind SHIFT_LEFT : LHS
+ public void testShiftLeft() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a << 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+
+ // Kind SHIFT_RIGHT : LHS
+ public void testShiftRight() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a >> 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+
+ // Kind RELATIONAL_LESSTHAN : bool
+ public void testRelationalLessThan() throws Exception {
+ Iterator i = parse( "void foo(); int foo( bool ); int b=5; int x = foo( b < 3 );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind RELATIONAL_GREATERTHAN : bool
+ public void testRelationalGreaterThan() throws Exception {
+ Iterator i = parse( "void foo(); int foo( bool ); int b=5; int x = foo( b > 3 );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind RELATIONAL_LESSTHANEQUALTO : bool
+ public void testRelationalLessThanOrEqual() throws Exception {
+ Iterator i = parse( "void foo(); int foo( bool ); int b=5; int x = foo( b <= 3 );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind RELATIONAL_GREATERTHANEQUALTO : bool
+ public void testRelationalGreaterThanOrEqual() throws Exception {
+ Iterator i = parse( "void foo(); int foo( bool ); int b=5; int x = foo( b >= 3 );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind EQUALITY_EQUALS : bool
+ public void testEqualityEquals() throws Exception {
+ Iterator i = parse( "void foo(); int foo( bool ); int b=5; int x = foo( b == 3 );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind EQUALITY_NOTEQUALS : bool
+ public void testEqualityNotEquals() throws Exception {
+ Iterator i = parse( "void foo(); int foo( bool ); int b=5; int x = foo( b != 3 );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ANDEXPRESSION : usual arithmetic conversions
+ public void testAndExpression() throws Exception {
+ Iterator i = parse( "int foo(); int foo( int ); int a = 3; int b= 5; int x = foo( a & b );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind EXCLUSIVEOREXPRESSION : usual arithmetic conversions
+ public void testExclusiveOrExpression() throws Exception {
+ Iterator i = parse( "int foo(); int foo( int ); int a = 3; int b= 5; int x = foo( a ^ b );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind INCLUSIVEOREXPRESSION : : usual arithmetic conversions
+ public void testInclusiveOrExpression() throws Exception {
+ Iterator i = parse( "int foo(); int foo( int ); int a = 3; int b= 5; int x = foo( a | b );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind LOGICALANDEXPRESSION : bool
+ public void testLogicalAndExpression() throws Exception {
+ Iterator i = parse( "int foo(); int foo( bool ); bool a = true; bool b= false; int x = foo( a && b );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind LOGICALOREXPRESSION : bool
+ public void testLogicalOrExpression() throws Exception {
+ Iterator i = parse( "int foo(); int foo( bool ); bool a = true; bool b= false; int x = foo( a || b );").getDeclarations();
+ IASTFunction foo = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind CONDITIONALEXPRESSION
+
+ // Kind THROWEXPRESSION
+
+ // Kind ASSIGNMENTEXPRESSION_NORMAL : LHS
+ public void testAssignmentExpressionNormal() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a = 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+
+ // Kind ASSIGNMENTEXPRESSION_PLUS : LHS
+ public void testAssignmentExpressionPlus() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a += 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_MINUS : LHS
+ public void testAssignmentExpressionMinus() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a -= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_MULT : LHS
+ public void testAssignmentExpressionMulti() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a *= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_DIV : LHS
+ public void testAssignmentExpressionDiv() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a /= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_MOD : LHS
+ public void testAssignmentExpressionMod() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a %= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_LSHIFT : LHS
+ public void testAssignmentExpressionLShift() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a >>= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_RSHIFT : LHS
+ public void testAssignmentExpressionRShift() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a <<= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_AND : LHS
+ public void testAssignmentExpressionAnd() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a &= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_OR : LHS
+ public void testAssignmentExpressionOr() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a |= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind ASSIGNMENTEXPRESSION_XOR : LHS
+ public void testAssignmentExpressionXOr() throws Exception {
+ Iterator i = parse( "int foo(int); int foo( bool ); int a = 10; int x = foo( a ^= 5 );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 2 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo1 );
+ assertFalse( references.hasNext() );
+ }
+ // Kind EXPRESSIONLIST : list of LHS, RHS
+ // Already tested with each test trying to find a reference to function.
}