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