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 19d465911b6..a9d6dfe575a 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 @@ -2041,6 +2041,26 @@ public class AST2CPPTests extends AST2BaseTest { assertSame( printf, r2 ); } + public void testBug86346() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("struct S; \n"); //$NON-NLS-1$ + buffer.append("extern S a; \n"); //$NON-NLS-1$ + buffer.append("void g( S ); \n"); //$NON-NLS-1$ + buffer.append("void h() { \n"); //$NON-NLS-1$ + buffer.append(" g( a ); \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); + + ICPPClassType S = (ICPPClassType) col.getName(0).resolveBinding(); + IFunction g = (IFunction) col.getName(3).resolveBinding(); + + assertInstances( col, S, 3 ); + assertInstances( col, g, 2 ); + } + public void testBug86288() throws Exception { String code = "int *foo( int *b ) { return (int *)(b); }"; //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java index d03623119ed..f8fe5d3d70e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java @@ -10,6 +10,7 @@ **********************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; /** @@ -25,14 +26,14 @@ public interface ICPPBase { * * @return */ - public ICPPClassType getBaseClass(); + public ICPPClassType getBaseClass() throws DOMException; /** * The visibility qualifier applied to the base class. * * @return */ - public int getVisibility(); + public int getVisibility() throws DOMException; public static final int v_private = ICPPASTBaseSpecifier.v_private; public static final int v_protected = ICPPASTBaseSpecifier.v_protected; @@ -43,6 +44,6 @@ public interface ICPPBase { * * @return */ - public boolean isVirtual(); + public boolean isVirtual() throws DOMException; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java index c3e4abc8aa7..3ea45c51456 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java @@ -14,14 +14,32 @@ */ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; +import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; /** * @author aniefer */ public class CPPBaseClause implements ICPPBase { + static public class CPPBaseProblem extends ProblemBinding implements ICPPBase { + public CPPBaseProblem( int id, char[] arg ) { + super( id, arg ); + } + public ICPPClassType getBaseClass() throws DOMException { + throw new DOMException( this ); + } + + public int getVisibility() throws DOMException { + throw new DOMException( this ); + } + + public boolean isVirtual() throws DOMException { + throw new DOMException( this ); + } + } ICPPASTBaseSpecifier base = null; public CPPBaseClause( ICPPASTBaseSpecifier base ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java index 5a1ab810813..364423624d8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java @@ -305,8 +305,12 @@ public class CPPClassType implements ICPPClassType, ICPPBinding { * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getBases() */ public ICPPBase [] getBases() { - if( definition == null ) - return null; //TODO + if( definition == null ){ + checkForDefinition(); + if( definition == null ){ + return new ICPPBase [] { new CPPBaseClause.CPPBaseProblem( IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) }; + } + } ICPPASTBaseSpecifier [] bases = definition.getBaseSpecifiers(); if( bases.length == 0 ) return ICPPBase.EMPTY_BASE_ARRAY; 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 006ba388346..199856b29e6 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 @@ -517,6 +517,8 @@ public class CPPSemantics { ICPPClassType cls = (ICPPClassType) t; ICPPBase[] bases = cls.getBases(); for( int i = 0; i < bases.length; i++ ){ + if( bases[i] instanceof IProblemBinding ) + continue; getAssociatedScopes( bases[i].getBaseClass(), namespaces, classes ); } } @@ -1744,8 +1746,12 @@ public class CPPSemantics { ICPPConstructor [] constructors = ((ICPPClassType)t).getConstructors(); if( constructors.length > 0 ){ - //the list out of Arrays.asList does not support remove, which we need - constructor = (ICPPConstructor) resolveFunction( data, constructors ); + if( constructors.length == 1 && constructors[0] instanceof IProblemBinding ) + constructor = null; + else { + //the list out of Arrays.asList does not support remove, which we need + constructor = (ICPPConstructor) resolveFunction( data, constructors ); + } } if( constructor != null && constructor.isExplicit() ){ constructor = null;