Example #1
0
void UdcDiagNoMatch(            // DIAGNOSE NO MATCHES FOR UDC LOOKUP
    PTREE src,                  // - ctor expression
    TYPE tgt_type,              // - target type
    unsigned msg_none,          // - message: no UDC's
    unsigned msg_many,          // - message: many functions
    FNOV_DIAG *fnov_diag )      // - overload diagnosis information
{
    SYMBOL orig;
    DIAG_INFO diag;

    diag.bad_src = NodeType( src );
    diag.bad_tgt = tgt_type;
    switch( fnov_diag->num_candidates ) {
      case 0 :
        PTreeErrorExpr( src, msg_none );
        break;
      case 1 :
        orig = FnovNextRejectEntry( fnov_diag );
        if( orig == NULL ) {
            /* no fns matched at all but there happened to be one */
            PTreeErrorExpr( src, msg_none );
        } else {
            diag.bad_fn = NULL;
            diag.bad_parm = 1;
            PTreeExtractLocn( src, &diag.location );
            displayDiagInfo( &diag, msg_none, src, orig );
        }
        break;
      default :
        CallDiagnoseRejects( src, msg_many, fnov_diag );
        ConversionTypesSet( diag.bad_src, diag.bad_tgt );
        ConversionDiagnoseInf();
        break;
    }
}
Example #2
0
static CNV_RETN emitConvMsg(    // EMIT A CONVERSION MESSAGE
    PTREE expr,                 // - expression for error
    TYPE src,                   // - source type
    TYPE tgt,                   // - target type
    MSG_NUM msg )               // - message code
{
    ConversionTypesSet( src, tgt );
    PTreeErrorExpr( expr, msg );
    return( CNV_ERR );
}
Example #3
0
static void displayDiagInfo(    // DISPLAY DIAG_INFO FOR ARGUMENT
    DIAG_INFO* diag,            // - diagnostic information
    unsigned msg,               // - error message
    PTREE expr,                 // - expression
    SYMBOL orig )               // - original function
{
    ConversionTypesSet( diag->bad_src, diag->bad_tgt );
    PTreeErrorExpr( expr, msg  );
    InfSymbolDeclaration( orig );
    if( diag->bad_parm == 0 ) {
        CErr1( INF_THIS_MISMATCH );
        ConversionDiagnoseInf();
    } else if( diag->bad_fn == NULL ) {
        displayParmMismatch( diag );
        ConversionDiagnoseInf();
    } else {
        displayParmMismatch( diag );
        CErr2p( INF_BAD_FN_OVERLOAD, diag->bad_fn );
        ConversionDiagnoseInfTgt();
    }
}
Example #4
0
CNV_RETN PtrConvertCommon(      // CONVERT TO COMMON PTR
    PTREE expr )                // - expression
{
    PTREE *r_left;              // - reference( left node )
    PTREE *r_right;             // - reference( right node )
    TYPE ltype;                 // - type on left
    TYPE rtype;                 // - type on right
    TYPE lptype;                // - new ptr type on left
    TYPE rptype;                // - new ptr type on right
    TYPE lbtype;                // - base type on left
    TYPE rbtype;                // - base type on right
    TYPE type;                  // - resultant type
    TYPE common;                // - common base type
    CNV_RETN retn;              // - conversion return

    r_left = &expr->u.subtree[0];
    ltype = NodeType( *r_left );
    r_right = &expr->u.subtree[1];
    rtype = NodeType( *r_right );
    if( same_ptr_types( ltype, rtype ) ) {
        type = ltype;
        if( CgTypeSize( ltype ) > CgTypeSize( rtype ) ) {
            expr->type = ltype;
        } else {
            expr->type = rtype;
        }
        retn = propogateNonZero( CNV_OK, expr );
    } else if( ptr_to_void( ltype ) ) {
        retn = NodeCheckCnvPtrVoid( &expr, rtype, ltype );
        retn = check_common( retn, expr, ltype );
    } else if( ptr_to_void( rtype ) ) {
        retn = NodeCheckCnvPtrVoid( &expr, ltype, rtype );
        retn = check_common( retn, expr, rtype );
    } else{
        lbtype = TypePointedAtModified( ltype );
        rbtype = TypePointedAtModified( rtype );
        switch( TypeCommonDerivation( lbtype, rbtype ) ) {
        case CTD_LEFT :
        case CTD_LEFT_VIRTUAL :
            retn = NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_left, ltype, rtype );
            retn = check_common( retn, expr, rtype );
            break;
        case CTD_RIGHT :
        case CTD_RIGHT_VIRTUAL :
            retn = NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_right, rtype, ltype );
            retn = check_common( retn, expr, ltype );
            break;
        case CTD_NO :
            common = TypeCommonBase( rbtype, lbtype );
            if( common != NULL ) {
                lptype = TypePointedAtReplace( ltype, common );
                rptype = TypePointedAtReplace( rtype, common );
                /* TypeCommonBase verified everything so these convs will work*/
                NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_left, ltype, lptype );
                NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_right, rtype, rptype);
                expr->type = expr->u.subtree[0]->type;
                retn = propogateNonZero( CNV_OK, expr );
            } else {
                retn = UserDefCnvToType( r_left, ltype, rtype );
                if( retn == CNV_IMPOSSIBLE ) {
                    retn = UserDefCnvToType( r_right, rtype, ltype );
                    retn = check_common( retn, expr, ltype );
                } else {
                    retn = check_common( retn, expr, rtype );
                }
            }
            break;
        case CTD_RIGHT_AMBIGUOUS :
            ConversionTypesSet( rtype, ltype );
        case CTD_LEFT_AMBIGUOUS :
            retn = CNV_AMBIGUOUS;
            break;
        case CTD_RIGHT_PRIVATE :
            ConversionTypesSet( rtype, ltype );
        case CTD_LEFT_PRIVATE :
            retn = CNV_PRIVATE;
            break;
        case CTD_RIGHT_PROTECTED :
            ConversionTypesSet( rtype, ltype );
        case CTD_LEFT_PROTECTED :
            retn = CNV_PROTECTED;
            break;
        }
    }
    return( retn );
}