Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Camelon2003-09-18 11:22:48 -0400
committerJohn Camelon2003-09-18 11:22:48 -0400
commit43d8ca642dcf39008a1037335b67f7d151dcf5e7 (patch)
treee4b7ee5d9c3b9930a5898444ef95a4322a715e70
parent51a73af86dfc48263b870da877579caead870558 (diff)
downloadorg.eclipse.cdt-43d8ca642dcf39008a1037335b67f7d151dcf5e7.tar.gz
org.eclipse.cdt-43d8ca642dcf39008a1037335b67f7d151dcf5e7.tar.xz
org.eclipse.cdt-43d8ca642dcf39008a1037335b67f7d151dcf5e7.zip
Patch for Hoda Amer
Core: In completeParseASTFactory.getExpressionResultType(): Added the support for expression types: PM_DOTSTAR, PM_ARROWSTAR, CONDITIONALEXPRESSION Tests: Added more success test cases to CompleteParseASTExpressionTest and more failure test cases to FailedCompleteParseASTExpressionTest in testing PM_DOTSTAR, PM_ARROWSTAR, CONDITIONALEXPRESSION
-rw-r--r--core/org.eclipse.cdt.core.tests/ChangeLog5
-rw-r--r--core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java144
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java215
-rw-r--r--core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java3
-rw-r--r--core/org.eclipse.cdt.core/parser/ChangeLog4
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java105
6 files changed, 428 insertions, 48 deletions
diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog
index 51e85e5c44..a10d9d7962 100644
--- a/core/org.eclipse.cdt.core.tests/ChangeLog
+++ b/core/org.eclipse.cdt.core.tests/ChangeLog
@@ -1,3 +1,8 @@
+2003-09-17 Hoda Amer
+ Added more success test cases to CompleteParseASTExpressionTest
+ and more failure test cases to FailedCompleteParseASTExpressionTest
+ in testing PM_DOTSTAR, PM_ARROWSTAR, CONDITIONALEXPRESSION
+
2003-09-16 Andrew Niefer
- modified resources/search/classDecl.cpp & include.h to include some operators
- added testOperators_bug43063_bug42979() to MethodDeclarationPatternTests
diff --git a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java
index dc71fe26c1..3e21c3d3b2 100644
--- a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java
+++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java
@@ -10,6 +10,14 @@
***********************************************************************/
package org.eclipse.cdt.core.parser.failedTests;
+import java.util.Iterator;
+
+import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
+import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
+import org.eclipse.cdt.core.parser.ast.IASTFunction;
+import org.eclipse.cdt.core.parser.ast.IASTMethod;
+import org.eclipse.cdt.core.parser.ast.IASTReference;
+import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.core.parser.tests.CompleteParseBaseTest;
/**
@@ -32,5 +40,139 @@ public class FailedCompleteParseASTExpressionTest extends CompleteParseBaseTest
{
super(name);
}
-
+
+// public void testPostfixSubscriptA_Bug43238() throws Exception
+// {
+// Iterator i = parse ("int pa[10][5] ; \n int f(int ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+// IASTVariable pa = (IASTVariable) i.next();
+// IASTFunction f1 = (IASTFunction) i.next();
+// IASTFunction f2 = (IASTFunction) i.next();
+// IASTVariable x = (IASTVariable) i.next();
+// Iterator references = callback.getReferences().iterator();
+// assertEquals( callback.getReferences().size(), 1 ); // should be = 2
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+// //assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+// }
+// public void testPostfixSubscriptB_Bug43238() throws Exception
+// {
+// Iterator i = parse ("int* pa[10][5] ; \n int f(int* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+// IASTVariable pa = (IASTVariable) i.next();
+// IASTFunction f1 = (IASTFunction) i.next();
+// IASTFunction f2 = (IASTFunction) i.next();
+// IASTVariable x = (IASTVariable) i.next();
+// Iterator references = callback.getReferences().iterator();
+// assertEquals( callback.getReferences().size(), 1 ); // should be = 2
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+// //assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+// }
+// public void testPostfixSubscriptWithReferences_Bug43238() throws Exception
+// {
+// Iterator i = parse ("class A{}; \n A *pa[10][5] ; \n int f(A* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+// IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+// IASTVariable pa = (IASTVariable) i.next();
+// IASTFunction f1 = (IASTFunction) i.next();
+// IASTFunction f2 = (IASTFunction) i.next();
+// IASTVariable x = (IASTVariable) i.next();
+// Iterator references = callback.getReferences().iterator();
+// assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+// assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+// }
+ public void testConditionalExpression_Bug43159() throws Exception {
+ Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable c = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 3 ); // should be 4
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
+ //assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+
+ public void testConditionalExpressionWithReferencesB_Bug43106() throws Exception {
+ Iterator i = parse( "class A{}; class B : public A{}; int foo(); int foo(A&); A a ; B b; int c = 0; int x = foo( c > 5 ? b : a );").getDeclarations();
+ IASTClassSpecifier cla = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTClassSpecifier clb = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable c = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 7 ); // should be 8
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), cla );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), cla );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), cla );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), clb );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ //assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
+ public void testPMDotStarPointerToMemberFunction_Bug43242() throws Exception
+ {
+ Iterator i = parse ("class A { int m(int); }; \n A a; int A::*pm = &A::m; \n int f(){} \n int f(int); \n int x = f((a.*pm)(5));").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ Iterator members = getDeclarations(cl);
+ IASTMethod method = (IASTMethod)members.next();
+ IASTVariable a = (IASTVariable) i.next();
+ IASTVariable pm = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( callback.getReferences().size(), 5 ); // should be 6
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), method );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), pm );
+// assertEquals( ((IASTReference) references.next()).getReferencedElement(), f2 );
+ }
+ public void testPMArrowStarPointerToMemberFunction_Bug43242() throws Exception
+ {
+ Iterator i = parse ("class A { int m(int); }; \n A * a; int A::*pm = &A::m; \n int f(){} \n int f(int); \n int x = f((a->*pm)(5));").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ Iterator members = getDeclarations(cl);
+ IASTMethod method = (IASTMethod)members.next();
+ IASTVariable a = (IASTVariable) i.next();
+ IASTVariable pm = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( callback.getReferences().size(), 5 ); // should be 6
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), method );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), pm );
+// assertEquals( ((IASTReference) references.next()).getReferencedElement(), f2 );
+ }
+ public void testUnaryStarCastexpressionPointerToFunction_Bug43241() throws Exception
+ {
+ Iterator i = parse ("int m(int); \n int *pm = &m; \n int f(){} \n int f(int); \n int x = f((*pm)(5));").getDeclarations();
+ IASTFunction m = (IASTFunction) i.next();
+ IASTVariable pm = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( callback.getReferences().size(), 2 ); // should be 3
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), m );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), pm );
+// assertEquals( ((IASTReference) references.next()).getReferencedElement(), f2 );
+ }
+
}
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java
index 1fbced5bff..2d5460ac62 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java
@@ -169,8 +169,61 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{
assertEquals( ar1.getReferencedElement(), a );
assertEquals( fr1.getReferencedElement(), f1 );
}
- // Kind POSTFIX_SUBSCRIPT
-
+ // Kind POSTFIX_SUBSCRIPT
+// public void testPostfixSubscript() throws Exception
+// {
+// Iterator i = parse ("int pa[10]; \n int f(int ia){} \n int f(void); \n int x = f(pa[1]);").getDeclarations();
+// IASTVariable pa = (IASTVariable) i.next();
+// IASTFunction f1 = (IASTFunction) i.next();
+// IASTFunction f2 = (IASTFunction) i.next();
+// IASTVariable x = (IASTVariable) i.next();
+// Iterator references = callback.getReferences().iterator();
+// assertEquals( callback.getReferences().size(), 2 );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+// }
+//
+// public void testPostfixSubscriptA() throws Exception
+// {
+// Iterator i = parse ("int pa[10][5] ; \n int f(int ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+// IASTVariable pa = (IASTVariable) i.next();
+// IASTFunction f1 = (IASTFunction) i.next();
+// IASTFunction f2 = (IASTFunction) i.next();
+// IASTVariable x = (IASTVariable) i.next();
+// Iterator references = callback.getReferences().iterator();
+// assertEquals( callback.getReferences().size(), 2 ); // should be = 2
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+// }
+//
+// public void testPostfixSubscriptB() throws Exception
+// {
+// Iterator i = parse ("int* pa[10][5] ; \n int f(int* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+// IASTVariable pa = (IASTVariable) i.next();
+// IASTFunction f1 = (IASTFunction) i.next();
+// IASTFunction f2 = (IASTFunction) i.next();
+// IASTVariable x = (IASTVariable) i.next();
+// Iterator references = callback.getReferences().iterator();
+// assertEquals( callback.getReferences().size(), 2 ); // should be = 2
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+// }
+//
+// public void testPostfixSubscriptWithReferences() throws Exception
+// {
+// Iterator i = parse ("class A{}; \n A *pa[10][5] ; \n int f(A* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+// IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+// IASTVariable pa = (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(), cl );
+// assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+// }
+
// Kind POSTFIX_FUNCTIONCALL : return type of called function
public void testPostfixFunctioncallBug42822() throws Exception
{
@@ -198,6 +251,24 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{
assertEquals( callback.getReferences().size(), 1 );
}
// Kind POSTFIX_TYPENAME_IDENTIFIER
+// public void testPostfixTypenameIdentifier() throws Exception{
+// Iterator i = parse( "class A {}; \n int foo(); int foo( A a ); \n int x = foo( typename A(); );").getDeclarations();
+// IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+// 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_TYPENAME_TEMPLATEID
@@ -284,23 +355,23 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{
}
// 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);
- }
-*/
+// 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
@@ -491,26 +562,59 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{
// 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() );
- }
-*/
+// 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
+ public void testPMDotStar() throws Exception
+ {
+ Iterator i = parse ("class A { int m; }; \n A a; int A::*pm; \n int f(){} \n int f(int); \n int x = f(a.*pm);").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTVariable a = (IASTVariable) i.next();
+ IASTVariable pm = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), pm );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), f2 );
+
+ }
+
// Kind PM_ARROWSTAR
+ public void testPMArrowStar() throws Exception
+ {
+ Iterator i = parse ("class A { int m; }; \n A * a; int A::*pm; \n int f(){} \n int f(int); \n int x = f(a->*pm);").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTVariable a = (IASTVariable) i.next();
+ IASTVariable pm = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), pm );
+ assertEquals( ((IASTReference) references.next()).getReferencedElement(), f2 );
+
+ }
// Kind MULTIPLICATIVE_MULTIPLY : usual arithmetic conversions
public void testMultiplicativeMultiply() throws Exception {
@@ -786,7 +890,48 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{
assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
assertFalse( references.hasNext() );
}
- // Kind CONDITIONALEXPRESSION
+ // Kind CONDITIONALEXPRESSION : conditional Expression Conversions
+// public void testConditionalExpression() throws Exception {
+// Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
+// IASTFunction foo1 = (IASTFunction)i.next();
+// IASTFunction foo2 = (IASTFunction)i.next();
+// IASTVariable a = (IASTVariable)i.next();
+// IASTVariable b = (IASTVariable)i.next();
+// IASTVariable c = (IASTVariable)i.next();
+// IASTVariable x = (IASTVariable)i.next();
+// assertFalse( i.hasNext() );
+// assertEquals( callback.getReferences().size(), 4 );
+// Iterator references =callback.getReferences().iterator();
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+// assertFalse( references.hasNext() );
+// }
+ // Kind CONDITIONALEXPRESSION with references : conditional Expression Conversions
+ public void testConditionalExpressionWithReferencesA() throws Exception {
+ Iterator i = parse( "class A{}; class B : public A{}; int foo(); int foo(A*); A *a ; B *b; int c = 0; int x = foo( c > 5 ? b : a );").getDeclarations();
+ IASTClassSpecifier cla = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTClassSpecifier clb = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable c = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 8 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), cla );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), cla );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), cla );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), clb );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
// Kind THROWEXPRESSION
diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java
index 9af967b3b0..32a9bc7ddf 100644
--- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java
+++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java
@@ -27,6 +27,7 @@ import org.eclipse.cdt.core.model.tests.BinaryTests;
import org.eclipse.cdt.core.model.tests.ElementDeltaTests;
import org.eclipse.cdt.core.model.tests.WorkingCopyTests;
import org.eclipse.cdt.core.parser.failedTests.ASTFailedTests;
+import org.eclipse.cdt.core.parser.failedTests.FailedCompleteParseASTExpressionTest;
import org.eclipse.cdt.core.parser.failedTests.STLFailedTests;
import org.eclipse.cdt.core.parser.tests.ParserTestSuite;
import org.eclipse.cdt.core.search.tests.SearchTestSuite;
@@ -94,7 +95,7 @@ public class AutomatedIntegrationSuite extends TestSuite
suite.addTestSuite(ASTFailedTests.class);
suite.addTestSuite(STLFailedTests.class);
suite.addTestSuite(CModelElementsFailedTests.class);
-// suite.addTestSuite(FailedCompleteParseASTExpressionTest.class);
+ suite.addTestSuite(FailedCompleteParseASTExpressionTest.class);
// Last test to trigger report generation
suite.addTest(suite.new GenerateReport("generateReport"));
diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog
index 239c622cf1..79407ea651 100644
--- a/core/org.eclipse.cdt.core/parser/ChangeLog
+++ b/core/org.eclipse.cdt.core/parser/ChangeLog
@@ -1,6 +1,10 @@
2003-09-16 Andrew Niefer
- added setThrowExceptionOnBadCharacterRead to IScanner to help with wildcard bug43063
+2003-09-17 Hoda Amer
+ In completeParseASTFactory.getExpressionResultType(): Added the support
+ for expression types: PM_DOTSTAR, PM_ARROWSTAR, CONDITIONALEXPRESSION
+
2003-09-16 John Camelon
Implement CompleteParse IASTFunction::previouslyDeclared().
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
index 914399eed2..15942d47ec 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
@@ -789,8 +789,13 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
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)){
+ if((kind == IASTExpression.Kind.POSTFIX_DOT_IDEXPRESSION)
+ || (kind == IASTExpression.Kind.POSTFIX_ARROW_IDEXPRESSION)
+ || (kind == IASTExpression.Kind.POSTFIX_DOT_TEMPL_IDEXPRESS)
+ || (kind == IASTExpression.Kind.POSTFIX_ARROW_TEMPL_IDEXP)
+ || (kind == IASTExpression.Kind.PM_DOTSTAR)
+ || (kind == IASTExpression.Kind.PM_ARROWSTAR)
+ ){
TypeInfo lhsInfo = (TypeInfo) ((ASTExpression)lhs).getResultType().iterator().next();
ISymbol containingScope = (ISymbol) lhsInfo.getTypeSymbol().getTypeSymbol();
if(containingScope != null){
@@ -822,11 +827,49 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return expression;
}
+ /*
+ * Conditional Expression conversion
+ */
+ protected TypeInfo conditionalExpressionConversions(TypeInfo second, TypeInfo third){
+ TypeInfo info = new TypeInfo();
+ if(second.equals(third)){
+ info = second;
+ return info;
+ }
+ if((second.getType() == TypeInfo.t_void) && (third.getType() != TypeInfo.t_void)){
+ info = third;
+ return info;
+ }
+ if((second.getType() != TypeInfo.t_void) && (third.getType() == TypeInfo.t_void)){
+ info = second;
+ return info;
+ }
+ if((second.getType() == TypeInfo.t_void) && (third.getType() == TypeInfo.t_void)){
+ info = second;
+ return info;
+ }
+ try{
+ info = ParserSymbolTable.getConditionalOperand(second, third);
+ return info;
+ } catch(ParserSymbolTableException e){
+ // empty info
+ return info;
+ }
+ }
/*
* 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){
+
+ // if you have a variable of type basic type, then we need to go to the basic type first
+ while( (lhs.getType() == TypeInfo.t_type) && (lhs.getTypeSymbol() != null)){
+ lhs = lhs.getTypeSymbol().getTypeInfo();
+ }
+ while( (rhs.getType() == TypeInfo.t_type) && (rhs.getTypeSymbol() != null)){
+ rhs = rhs.getTypeSymbol().getTypeInfo();
+ }
+
TypeInfo info = new TypeInfo();
if(
( lhs.checkBit(TypeInfo.isLong) && lhs.getType() == TypeInfo.t_double)
@@ -894,7 +937,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
// types that resolve to void
if ((expression.getExpressionKind() == IASTExpression.Kind.PRIMARY_EMPTY)
- || (expression.getExpressionKind() == IASTExpression.Kind.THROWEXPRESSION)) {
+ || (expression.getExpressionKind() == IASTExpression.Kind.THROWEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DOT_DESTRUCTOR)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_ARROW_DESTRUCTOR)
+ || (expression.getExpressionKind() == IASTExpression.Kind.DELETE_CASTEXPRESSION)
+ || (expression.getExpressionKind() == IASTExpression.Kind.DELETE_VECTORCASTEXPRESSION)
+ ){
info.setType(TypeInfo.t_void);
result.add(info);
return result;
@@ -1000,8 +1048,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
|| (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_TYPEID_TYPEID)
){
info.setType(TypeInfo.t_type);
- if(symbol != null)
- info.setTypeSymbol(symbol);
+ info.setTypeSymbol(symbol);
result.add(info);
return result;
}
@@ -1027,9 +1074,22 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
result.add(info);
return result;
}
+ // subscript
+// if (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SUBSCRIPT){
+// List lhsResult = ((ASTExpression)expression.getLHSExpression()).getResultType();
+// if( lhsResult.iterator().hasNext())
+// info = (TypeInfo)lhsResult.iterator().next();
+// if ((info != null) && (info.getTypeSymbol() != null)){
+// info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));
+// }
+// result.add(info);
+// return result;
+// }
// 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)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DOT_TEMPL_IDEXPRESS)
+ || (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_ARROW_TEMPL_IDEXP)
){
if(symbol != null){
info = new TypeInfo(symbol.getTypeInfo());
@@ -1037,6 +1097,22 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return result;
}
}
+ // the dot* and the arrow* are the same as dot/arrow + unary star
+ if ((expression.getExpressionKind() == IASTExpression.Kind.PM_DOTSTAR)
+ || (expression.getExpressionKind() == IASTExpression.Kind.PM_ARROWSTAR)
+ ){
+ List rhsResult = ((ASTExpression)expression.getRHSExpression()).getResultType();
+ if( rhsResult.iterator().hasNext())
+ info = (TypeInfo)rhsResult.iterator().next();
+ if (info != null){
+ info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));
+ }
+ if(symbol != null){
+ info.setTypeSymbol(symbol);
+ }
+ result.add(info);
+ return result;
+ }
// this
if (expression.getExpressionKind() == IASTExpression.Kind.PRIMARY_THIS){
if(symbol != null)
@@ -1047,6 +1123,18 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
result.add(info);
return result;
}
+ }
+ // conditional
+ if (expression.getExpressionKind() == IASTExpression.Kind.CONDITIONALEXPRESSION){
+ ASTExpression right = (ASTExpression)expression.getRHSExpression();
+ ASTExpression third = (ASTExpression)expression.getThirdExpression();
+ if((right != null ) && (third != null)){
+ TypeInfo rightType =(TypeInfo)right.getResultType().iterator().next();
+ TypeInfo thirdType =(TypeInfo)third.getResultType().iterator().next();
+ info = conditionalExpressionConversions(rightType, thirdType);
+ result.add(info);
+ return result;
+ }
}
// new
/* if((expression.getExpressionKind() == IASTExpression.Kind.NEW_NEWTYPEID)
@@ -1073,13 +1161,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
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;
@@ -1676,6 +1758,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
isDestructor = true;
}
}
+
symbol.setIsForwardDeclaration(!isFunctionDefinition);
boolean previouslyDeclared = false;

Back to the top