diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java index 330ce9acb08..25a4fb3bdf7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java @@ -1207,17 +1207,37 @@ public class CompleteParser2Tests extends TestCase { public void testBug43679_A () throws Exception { - parse( "struct Sample { int size() const; }; extern const Sample * getSample(); int trouble() { return getSample()->size(); } ", false ); //$NON-NLS-1$ + IASTTranslationUnit tu = parse( "struct Sample { int size() const; }; extern const Sample * getSample(); int trouble() { return getSample()->size(); } " ); //$NON-NLS-1$ + CPPNameCollector col = new CPPNameCollector(); + CPPVisitor.visitTranslationUnit( tu, col ); + + assertEquals( col.size(), 7 ); + ICompositeType sample = (ICompositeType) col.getName(0).resolveBinding(); + ICPPMethod size = (ICPPMethod) col.getName(1).resolveBinding(); + IFunction getSample = (IFunction) col.getName(3).resolveBinding(); + + assertInstances( col, sample, 2 ); + assertInstances( col, size, 2 ); + assertInstances( col, getSample, 2 ); } public void testBug43679_B () throws Exception { - parse( "struct Sample{int size() const; }; struct Sample; ", false ); //$NON-NLS-1$ + IASTTranslationUnit tu = parse( "struct Sample{int size() const; }; struct Sample; " ); //$NON-NLS-1$ + CPPNameCollector col = new CPPNameCollector(); + CPPVisitor.visitTranslationUnit( tu, col ); + + assertEquals( col.size(), 3 ); + ICompositeType sample = (ICompositeType) col.getName(0).resolveBinding(); + ICPPMethod size = (ICPPMethod) col.getName(1).resolveBinding(); + + assertInstances( col, sample, 2 ); + assertInstances( col, size, 1 ); } public void testBug43951() throws Exception { - parse( "class B{ B(); ~B(); }; B::B(){} B::~B(){}", false ); //$NON-NLS-1$ + parse( "class B{ B(); ~B(); }; B::B(){} B::~B(){}" ); //$NON-NLS-1$ } public void testBug44342() throws Exception { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPArrayType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPArrayType.java index 5229354eb74..ea857370007 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPArrayType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPArrayType.java @@ -31,4 +31,11 @@ public class CPPArrayType implements IArrayType, ITypeContainer { public IType getType(){ return type; } + + public boolean equals(Object obj) { + if( obj instanceof IArrayType ){ + return ((IArrayType) obj).getType().equals( type ); + } + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 2d690aa829d..07f4997a525 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -502,6 +502,8 @@ public class CPPVisitor { return CPPSemantics.resolveBinding( ((IASTIdExpression)node).getName() ); } else if( node instanceof ICPPASTFieldReference ){ return CPPSemantics.resolveBinding( ((ICPPASTFieldReference)node).getFieldName() ); + } else if( node instanceof IASTFunctionCallExpression ){ + return resolveBinding( ((IASTFunctionCallExpression)node).getFunctionNameExpression() ); } return null; } @@ -1170,6 +1172,13 @@ public class CPPVisitor { return new CPPPointerType( type ); } + } else if( expression instanceof IASTFunctionCallExpression ){ + IBinding binding = resolveBinding( expression ); + if( binding instanceof IFunction ){ + IFunctionType fType = ((IFunction)binding).getType(); + if( fType != null ) + return fType.getReturnType(); + } } return null; }