1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

fix bug 86346

This commit is contained in:
Andrew Niefer 2005-02-23 20:40:24 +00:00
parent 2d33ca0657
commit ad1ab8d1d2
5 changed files with 56 additions and 7 deletions

View file

@ -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$

View file

@ -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;
}

View file

@ -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 ){

View file

@ -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;

View file

@ -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;