Esempio n. 1
0
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 );
}
Esempio n. 2
0
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 */
}