1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

bug 73869: exceptions while parsing boost headers

This commit is contained in:
Andrew Niefer 2005-07-15 20:45:59 +00:00
parent 5bb3a3f5a1
commit aec1c2f69e
6 changed files with 27 additions and 12 deletions

View file

@ -62,6 +62,9 @@ public class CPPNamespace implements ICPPNamespace, ICPPInternalBinding {
ICPPASTTranslationUnit tu = null; ICPPASTTranslationUnit tu = null;
public CPPNamespace( ICPPASTNamespaceDefinition nsDef ){ public CPPNamespace( ICPPASTNamespaceDefinition nsDef ){
findAllDefinitions( nsDef ); findAllDefinitions( nsDef );
if( namespaceDefinitions.length == 0 ){
namespaceDefinitions = (IASTName[]) ArrayUtil.append( IASTName.class, namespaceDefinitions, nsDef.getName() );
}
} }
/* (non-Javadoc) /* (non-Javadoc)

View file

@ -2215,7 +2215,7 @@ public class CPPSemantics {
numSourceParams = ( useImplicitObj ) ? sourceParameters.length + 1 : sourceParameters.length; numSourceParams = ( useImplicitObj ) ? sourceParameters.length + 1 : sourceParameters.length;
int numTargetParams = 0; int numTargetParams = 0;
if( currFnCost == null ){ if( currFnCost == null || currFnCost.length != ((numSourceParams == 0) ? 1 : numSourceParams) ){
currFnCost = new Cost [ (numSourceParams == 0) ? 1 : numSourceParams ]; currFnCost = new Cost [ (numSourceParams == 0) ? 1 : numSourceParams ];
} }
@ -2279,8 +2279,10 @@ public class CPPSemantics {
//In order for this function to be better than the previous best, it must //In order for this function to be better than the previous best, it must
//have at least one parameter match that is better that the corresponding //have at least one parameter match that is better that the corresponding
//match for the other function, and none that are worse. //match for the other function, and none that are worse.
for( int j = 0; j < numSourceParams || j == 0; j++ ){ int len = ( bestFnCost == null || currFnCost.length < bestFnCost.length ) ? currFnCost.length : bestFnCost.length;
if( currFnCost[ j ].rank < 0 ){ for( int j = 1; j <= len; j++ ){
Cost currCost = currFnCost[ currFnCost.length - j ];
if( currCost.rank < 0 ){
hasWorse = true; hasWorse = true;
hasBetter = false; hasBetter = false;
break; break;
@ -2288,10 +2290,9 @@ public class CPPSemantics {
//an ambiguity in the user defined conversion sequence is only a problem //an ambiguity in the user defined conversion sequence is only a problem
//if this function turns out to be the best. //if this function turns out to be the best.
currHasAmbiguousParam = ( currFnCost[ j ].userDefined == 1 ); currHasAmbiguousParam = ( currCost.userDefined == 1 );
if( bestFnCost != null ){ if( bestFnCost != null ){
comparison = currFnCost[ j ].compare( bestFnCost[ j ] ); comparison = currCost.compare( bestFnCost[ bestFnCost.length - j ] );
hasWorse |= ( comparison < 0 ); hasWorse |= ( comparison < 0 );
hasBetter |= ( comparison > 0 ); hasBetter |= ( comparison > 0 );
} else { } else {

View file

@ -150,6 +150,11 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
} }
public void addSpecialization( IType [] types, ICPPSpecialization spec ){ public void addSpecialization( IType [] types, ICPPSpecialization spec ){
if( types == null )
return;
for( int i = 0; i < types.length; i++ )
if( types[i] == null )
return;
if( instances == null ) if( instances == null )
instances = new ObjectMap( 2 ); instances = new ObjectMap( 2 );
instances.put( types, spec ); instances.put( types, spec );

View file

@ -488,7 +488,7 @@ public class CPPTemplates {
else if( !t.isSameType( arg ) ){ else if( !t.isSameType( arg ) ){
continue outer; continue outer;
} }
} else if( arg == null || !matchTemplateParameterAndArgument( param, arg )){ } else if( arg == null || !matchTemplateParameterAndArgument( param, arg, map )){
continue outer; continue outer;
} }
} }
@ -541,7 +541,7 @@ public class CPPTemplates {
arg = (IType) map.get( param ); arg = (IType) map.get( param );
} }
if( arg == null || !matchTemplateParameterAndArgument( param, arg ) ) if( arg == null || !matchTemplateParameterAndArgument( param, arg, map ) )
return null; return null;
result[i] = arg; result[i] = arg;
@ -1394,7 +1394,7 @@ public class CPPTemplates {
//TODO //TODO
return true; return true;
} }
static protected boolean matchTemplateParameterAndArgument( ICPPTemplateParameter param, IType argument ){ static protected boolean matchTemplateParameterAndArgument( ICPPTemplateParameter param, IType argument, ObjectMap map ){
if( !isValidArgument(param, argument) ){ if( !isValidArgument(param, argument) ){
return false; return false;
} }
@ -1431,6 +1431,9 @@ public class CPPTemplates {
} else { } else {
try { try {
IType pType = ((ICPPTemplateNonTypeParameter)param).getType(); IType pType = ((ICPPTemplateNonTypeParameter)param).getType();
if( map != null && pType != null && map.containsKey( pType ) ){
pType = (IType) map.get( pType );
}
Cost cost = CPPSemantics.checkStandardConversionSequence( argument, pType ); Cost cost = CPPSemantics.checkStandardConversionSequence( argument, pType );
if( cost == null || cost.rank == Cost.NO_MATCH_RANK ){ if( cost == null || cost.rank == Cost.NO_MATCH_RANK ){
@ -1532,7 +1535,7 @@ public class CPPTemplates {
} }
} }
if( CPPTemplates.matchTemplateParameterAndArgument( param, arg ) ){ if( CPPTemplates.matchTemplateParameterAndArgument( param, arg, map ) ){
map.put( param, arg ); map.put( param, arg );
actualArgs[i] = arg; actualArgs[i] = arg;
} else { } else {

View file

@ -821,7 +821,10 @@ public class CPPVisitor {
} }
} }
} catch( DOMException e ){ } catch( DOMException e ){
return e.getProblem(); IProblemBinding problem = e.getProblem();
if( problem instanceof ICPPScope )
return problem;
return new CPPScope.CPPScopeProblem( problem.getASTNode(), problem.getID(), problem.getNameCharArray() );
} }
return getContainingScope( parent ); return getContainingScope( parent );
} }

View file

@ -1894,7 +1894,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
name = operatorId(start, null); name = operatorId(start, null);
else { else {
backup(mark); backup(mark);
throwBacktrack(start.getOffset(), end.getEndOffset() throwBacktrack(start.getOffset(), (end != null ? end.getEndOffset() : start.getEndOffset())
- start.getOffset()); - start.getOffset());
} }
} else if (LT(1) == IToken.t_operator) } else if (LT(1) == IToken.t_operator)