diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 2a8fef0524d..7a16f8c56c7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -2164,5 +2164,31 @@ public class AST2CPPTests extends AST2BaseTest { assertInstances( col, i1, 2 ); assertInstances( col, i2, 4 ); } + + public void testBug86350() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("class X { int i, j; }; \n"); //$NON-NLS-1$ + buffer.append("class Y { X x; }; \n"); //$NON-NLS-1$ + buffer.append("void foo() { \n"); //$NON-NLS-1$ + buffer.append(" const Y y; \n"); //$NON-NLS-1$ + buffer.append(" y.x.i++; \n"); //$NON-NLS-1$ + buffer.append(" y.x.j++; \n"); //$NON-NLS-1$ + buffer.append(" Y* p = const_cast(&y); \n"); //$NON-NLS-1$ + buffer.append(" p->x.i; \n"); //$NON-NLS-1$ + buffer.append(" p->x.j; \n"); //$NON-NLS-1$ + buffer.append("} \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); + CPPNameCollector col = new CPPNameCollector(); + tu.getVisitor().visitTranslationUnit(col); + + ICPPField i = (ICPPField) col.getName(1).resolveBinding(); + ICPPField j = (ICPPField) col.getName(2).resolveBinding(); + ICPPField x = (ICPPField) col.getName(5).resolveBinding(); + + assertInstances( col, i, 3 ); + assertInstances( col, j, 3 ); + assertInstances( col, x, 5 ); + } } 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 08df050df29..d1060f8a458 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 @@ -1824,7 +1824,18 @@ public class CPPVisitor implements ICPPASTVisitor { return new CPPPointerType( type ); } return type; - } + } else if( expression instanceof ICPPASTFieldReference ){ + IASTName name = ((ICPPASTFieldReference)expression).getFieldName(); + IBinding binding = name.resolveBinding(); + try { + if( binding instanceof IVariable ) + return ((IVariable)binding).getType(); + else if( binding instanceof IFunction ) + return ((IFunction)binding).getType(); + } catch ( DOMException e ) { + return e.getProblem(); + } + } return null; }