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; } }
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 ); }
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(); } }
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 ); }