diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 47d6fc84694..0f83d0c0d82 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -3728,7 +3728,7 @@ public class AST2Tests extends AST2BaseTest { // int c = (*a).method(); // Problem: method // } // }; - public void _test186736() throws Exception { + public void test186736() throws Exception { StringBuffer buffer = getContents(1)[0]; IASTTranslationUnit tu= parseAndCheckBindings(buffer.toString(), ParserLanguage.CPP); CNameCollector col = new CNameCollector(); @@ -3776,7 +3776,7 @@ public class AST2Tests extends AST2BaseTest { // int b2 = a2->method(); // Problem: method // } // }; - public void _test186736_variant1() throws Exception { + public void test186736_variant1() throws Exception { StringBuffer buffer = getContents(1)[0]; IASTTranslationUnit tu= parseAndCheckBindings(buffer.toString(), ParserLanguage.CPP); CNameCollector col = new CNameCollector(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java index 6f0c15ab938..a147e1db6be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java @@ -87,6 +87,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; @@ -359,12 +360,26 @@ public class CPPSemantics { tempName = (IASTName) tempName.getParent(); ASTNodeProperty prop = tempName.getPropertyInParent(); - if( prop == IASTFieldReference.FIELD_NAME || + if( (prop == STRING_LOOKUP_PROPERTY && tempName.getParent() instanceof ICPPASTUnaryExpression) ) { + ICPPASTUnaryExpression unaryExp = (ICPPASTUnaryExpression) tempName.getParent(); + IASTExpression oprd= unaryExp.getOperand(); + return CPPVisitor.getExpressionType(oprd); + } else if( prop == IASTFieldReference.FIELD_NAME || (prop == STRING_LOOKUP_PROPERTY && tempName.getParent() instanceof ICPPASTFieldReference) ) { ICPPASTFieldReference fieldRef = (ICPPASTFieldReference) tempName.getParent(); implied = CPPVisitor.getExpressionType( fieldRef.getFieldOwner() ); - if( fieldRef.isPointerDereference() && implied instanceof IPointerType ){ + IType ultimateImplied= getUltimateType(implied, true); + if( prop != STRING_LOOKUP_PROPERTY && fieldRef.isPointerDereference() && ultimateImplied instanceof ICPPClassType) { + ICPPFunction operator= findOperator(fieldRef, (ICPPClassType) ultimateImplied); + try { + if(operator!=null) { + implied= operator.getType().getReturnType(); + } + } catch(DOMException de) { + return de.getProblem(); + } + } else if( fieldRef.isPointerDereference() && implied instanceof IPointerType ){ try { implied = ((IPointerType)implied).getType(); } catch ( DOMException e ) { @@ -3278,7 +3293,12 @@ public class CPPSemantics { astName.setPropertyInParent( STRING_LOOKUP_PROPERTY ); LookupData data = null; - if( exp instanceof IASTArraySubscriptExpression ){ + if( exp instanceof IASTUnaryExpression) { + astName.setName( ICPPASTOperatorName.OPERATOR_STAR ); + data = new LookupData( astName ); + data.forceQualified = true; + data.functionParameters = IASTExpression.EMPTY_EXPRESSION_ARRAY; + } else if( exp instanceof IASTArraySubscriptExpression ){ astName.setName( ICPPASTOperatorName.OPERATOR_BRACKET ); data = new LookupData( astName ); data.forceQualified = true; 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 5b2b5a61ae5..76ed6ea68a8 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 @@ -863,8 +863,7 @@ public class CPPVisitor { IASTExpression owner = ((ICPPASTFieldReference)parent).getFieldOwner(); IType type = getExpressionType( owner ); if( ((ICPPASTFieldReference)parent).isPointerDereference() ){ - while( type instanceof ITypedef ) - type = ((ITypedef)type).getType(); + type= CPPSemantics.getUltimateType(type, true); if( type instanceof ICPPClassType ){ ICPPFunction op = CPPSemantics.findOperator( (IASTFieldReference)parent, (ICPPClassType) type ); if( op != null ){ @@ -1865,6 +1864,16 @@ public class CPPVisitor { break; } } + if( op == IASTUnaryExpression.op_star && type instanceof ICPPClassType) { + try { + ICPPFunction operator= CPPSemantics.findOperator(expression, (ICPPClassType) type); + if(operator!=null) { + return operator.getType().getReturnType(); + } + } catch(DOMException de) { + return de.getProblem(); + } + } if( op == IASTUnaryExpression.op_star && (type instanceof IPointerType || type instanceof IArrayType) ){ try { return ((ITypeContainer)type).getType();