static typecheck_err ChkCompatibleFunctionParms( TYPEPTR typ1, TYPEPTR typ2, bool topLevelCheck ) { TYPEPTR *plist1; TYPEPTR *plist2; TYPEPTR p1; TYPEPTR p2; int parmno; typecheck_err rc; rc = TCE_OK; /* indicate functions are compatible */ plist1 = typ1->u.fn.parms; plist2 = typ2->u.fn.parms; if( plist1 != plist2 ) { if( plist1 == NULL ) { plist1 = plist2; plist2 = NULL; } if( plist2 == NULL ) { for( parmno = 1; (p1 = *plist1++) != NULL; ++parmno ) { if( p1->decl_type == TYPE_DOT_DOT_DOT ) { break; } if( !ChkParmPromotion( p1 ) ) { if( topLevelCheck ) { CErr2( ERR_PARM_TYPE_MISMATCH, parmno ); } rc = TCE_TYPE_MISMATCH; } } } else { p1 = *plist1++; p2 = *plist2++; for( parmno = 1; p1 != NULL && p2 != NULL; ++parmno ) { if( p1->decl_type == TYPE_DOT_DOT_DOT || p2->decl_type == TYPE_DOT_DOT_DOT ) { break; } if( !IdenticalType( p1, p2 ) ) { if( topLevelCheck ) { SetDiagType2( p1, p2 ); CErr2( ERR_PARM_TYPE_MISMATCH, parmno ); SetDiagPop(); } rc = TCE_TYPE_MISMATCH; } p1 = *plist1++; p2 = *plist2++; } if( p1 != NULL && p1->decl_type == TYPE_DOT_DOT_DOT || p2 != NULL && p2->decl_type == TYPE_DOT_DOT_DOT ) { p1 = NULL; p2 = NULL; } if( p1 != NULL || p2 != NULL ) { if( topLevelCheck ) { CErr1( ERR_PARM_COUNT_MISMATCH ); } rc = TCE_PARM_COUNT_MISMATCH; } } } return( rc ); }
int ChkCompatibleFunction( TYPEPTR typ1, TYPEPTR typ2, int topLevelCheck ) { TYPEPTR *plist1; TYPEPTR *plist2; int parm_count; plist1 = typ1->u.fn.parms; plist2 = typ2->u.fn.parms; if( plist1 != plist2 ) { if( plist1 == NULL ) { return( ChkParmPromotion( plist2, topLevelCheck ) ); } else if( plist2 == NULL ) { return( ChkParmPromotion( plist1, topLevelCheck ) ); } parm_count = 1; for( ;; ) { if( *plist1 == NULL && *plist2 == NULL ) break; if( *plist1 == NULL || *plist2 == NULL ) { if( topLevelCheck ) { CErr1( ERR_PARM_COUNT_MISMATCH ); } return( TC_PARM_COUNT_MISMATCH ); } if( ! IdenticalType( *plist1, *plist2 ) ) { if( topLevelCheck ) { SetDiagType2( *plist1, *plist2 ); CErr2( ERR_PARM_TYPE_MISMATCH, parm_count ); SetDiagPop(); } return( TC_PARM_TYPE_MISMATCH + parm_count ); } ++plist1; ++plist2; ++parm_count; } } return( TC_OK ); /* indicate functions are compatible */ }