コード例 #1
0
ファイル: analudc.c プロジェクト: Azarien/open-watcom-v2
PTREE UdcCall                   // CALL UDC FUNCTION
    ( PTREE src                 // - source expression
    , TYPE udcf_type            // - type for udcf
    , CALL_DIAG* diagnosis )    // - call diagnosis
{
    PTREE node;                 // - node under construction
    SEARCH_RESULT* result;      // - result for scope diagnosis
    TYPE class_type;            // - class for UDCF

    class_type = ClassTypeForType( NodeType( src ) );
    result = ScopeFindScopedMemberConversion
                    ( class_type->u.c.scope
                    , NULL
                    , udcf_type
                    , TF1_NULL );
    node = NodeMakeCallee( result->sym );
    node->u.symcg.result = result;
    node->cgop = CO_NAME_CONVERT;
    node = NodeDottedFunction( src, node );
    node = PTreeCopySrcLocation( node, src );
    node = NodeBinary( CO_CALL_NOOVLD, node, NULL );
    node = PTreeCopySrcLocation( node, src );
    node = AnalyseCall( node, diagnosis );
    return node;
}
コード例 #2
0
static SYMBOL getSymInScope(    // GET A SYMBOL IN A SCOPE
    SCOPE scope,                // - the scope
    SYMBOL orig )               // - original symbol
{
    SEARCH_RESULT *result;      // - search result for symbol
    SYMBOL sym;                 // - the symbol
    arg_list *alist;            // - arguments for function
    NAME name;                  // - symbol name

    name = orig->name->name;
    alist = SymFuncArgList( orig );
    if( name == CppConversionName() ) {
        result = ScopeFindScopedMemberConversion( scope
                                                , scope
                                                , SymFuncReturnType( orig )
                                                , alist->qualifier
                                                );
        if( result == NULL ) {
            sym = NULL;
        } else {
            sym = result->sym;
            ScopeFreeResult( result );
            if( sym != NULL ) {
                if( SymScope( sym ) != scope ) {
                    sym = NULL;
                }
            }
        }
    } else {
        result = ScopeContainsMember( scope, name );
        if( result == NULL ) {
            sym = NULL;
        } else {
            sym = result->sym_name->name_syms;
            // we may have found a type-name, so check for NULL
            if( sym != NULL && SymIsFunction( sym ) ) {
                switch( FuncOverloaded( &sym
                                      , result
                                      , sym
                                      , alist
                                      , NULL ) ) {
                case FNOV_NONAMBIGUOUS :
                    break;
                default :
                    sym = NULL;
                    break;
                }
            } else {
                sym = NULL;
            }
            ScopeFreeResult( result );
        }
    }
    return( sym );
}