or.cc

Go to the documentation of this file.
00001 /*
00002    The lestes compiler suite
00003    Copyright (C) 2002, 2003, 2004, 2005 Miroslav Tichy
00004    Copyright (C) 2002, 2003, 2004, 2005 Petr Zika
00005    Copyright (C) 2002, 2003, 2004, 2005 Vojtech Hala
00006    Copyright (C) 2002, 2003, 2004, 2005 Jiri Kosina
00007    Copyright (C) 2002, 2003, 2004, 2005 Pavel Sanda
00008    Copyright (C) 2002, 2003, 2004, 2005 Jan Zouhar
00009    Copyright (C) 2002, 2003, 2004, 2005 Rudolf Thomas
00010 
00011    This program is free software; you can redistribute it and/or modify
00012    it under the terms of the GNU General Public License as published by
00013    the Free Software Foundation; version 2 of the License.
00014 
00015    This program is distributed in the hope that it will be useful,
00016    but WITHOUT ANY WARRANTY; without even the implied warranty of
00017    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018    GNU General Public License for more details.
00019 
00020    See the full text of the GNU General Public License version 2, and
00021    the limitations in the file doc/LICENSE.
00022 
00023    By accepting the license the licensee waives any and all claims
00024    against the copyright holder(s) related in whole or in part to the
00025    work, its use, and/or the inability to use it.
00026  
00027  */
00028 /*! \file
00029  * This file contains implementation of overload resolution, according to 
00030  * chapter 13, especially 13.3.
00031  *
00032  * \author jikos
00033  */
00034 #include <lestes/lang/cplus/sem/or_ics.g.hh>
00035 #include <lestes/lang/cplus/sem/or_or.g.hh>
00036 #include <lestes/lang/cplus/sem/as_decl.g.hh>
00037 #include <lestes/lang/cplus/sem/or.g.hh>
00038 #include <lestes/lang/cplus/sem/ss_declaration.g.hh>
00039 #include <lestes/lang/cplus/sem/ss_statement.g.hh>
00040 #include <lestes/lang/cplus/sem/ss_decl_name.g.hh>
00041 #include <lestes/lang/cplus/sem/sa_decl_seq_compound_pair_creator.g.hh>
00042 #include <lestes/lang/cplus/sem/ss_misc.g.hh>
00043 #include <lestes/lang/cplus/sem/ss_type.g.hh>
00044 #include <lestes/lang/cplus/sem/ss_type_builtin.g.hh>
00045 #include <lestes/lang/cplus/sem/as_id_to_declaration_set.g.hh>
00046 #include <lestes/lang/cplus/sem/li_func_by_name.g.hh>
00047 #include <lestes/lang/cplus/sem/li_func_by_name_in_single_scope.g.hh>
00048 #include <lestes/lang/cplus/sem/sa_context.g.hh>
00049 #include <lestes/lang/cplus/sem/or.hh>
00050 #include <lestes/lang/cplus/sem/or_logger.hh>
00051 #include <lestes/msg/logger.hh>
00052 #include <lestes/std/dumper.hh>
00053 
00054 package(lestes);
00055 package(lang);
00056 package(cplus);
00057 package(sem);
00058 
00059 declare_logger( or_log );
00060 initialize_logger( or_log, "overload", or_logger );
00061 
00062 typedef ::lestes::std::set< srp< ss_function_declaration > > func_decl_set;
00063 typedef ::lestes::std::list< srp< ss_declaration > > decl_list;
00064 
00065 ptr< or_ics_functional > or_find_ics(ptr< or_or_functional > source, ptr< ss_type > target);
00066 bool is_not_worse_conv_seq(ptr< or_ics_functional > r1, ptr< or_or_functional > e1,ptr< or_ics_functional > r2, ptr< or_or_functional > e2);
00067 bool is_better_conv_seq (ptr< or_ics_functional > r1, ptr< or_or_functional > e1, ptr< or_ics_functional > r2, ptr< or_or_functional > e2);
00068 
00069 
00070 /*!
00071  * This function tests if there exists implicit conversion sequence from expressions,
00072  * representing arguments in function call, to parameters of the candidate function.
00073  * 
00074  * \bug This functions doesn't deal with elipsis functions yet, as thery are not handled by
00075  * sem so far
00076  *
00077  * \return true if the conversion exists, false otherwise
00078  */
00079 bool exists_ics_conversion (ptr< ss_function_declaration > candidate, ptr< exprlist > exprs)
00080 {
00081         ptr< decl_list > params = candidate->parameters_get()->contents_get();
00082         decl_list::iterator it = params->begin();
00083         ::lestes::std::list< srp< or_or_functional > >::iterator it_expr = exprs->begin();
00084 
00085         for(; it_expr != exprs->end() && it != params->end(); ++it, ++it_expr) {
00086                 if(!or_find_ics(*it_expr, (*it)->type_get()))
00087                         return false;
00088         }
00089 
00090         /* TODO
00091         for(; it_exprs != exprs->end(); ++it_expr) {
00092                 if(!find_ics_ellipsis(*it_expr))
00093                         return false;
00094         }
00095         */
00096         return true;
00097 }
00098 
00099 /*!
00100  * This function filters out those candidates from candidates list, for which the 
00101  * implicit conversion sequence from expressions coming from call, to function
00102  * parameters, doesn't exist
00103  *
00104  * \return filtered list of candidates
00105  */
00106 ptr< func_decl_set > filter_ics_existence(ptr< func_decl_set > candidates, ptr< exprlist > exprs)
00107 {
00108         ptr< func_decl_set > new_cands = func_decl_set::create();
00109 
00110         func_decl_set::iterator it = candidates->begin(), it_end = candidates->end();
00111 
00112         for (it = candidates->begin(); it != it_end; ++it) {
00113                 if (exists_ics_conversion(*it, exprs)) 
00114                         new_cands->insert(*it);
00115                 
00116         }
00117         return new_cands;
00118 }
00119 
00120 /*!
00121  * This function filters out those candidates from candidates list, which do not have
00122  * proper count of arguments.
00123  *
00124  * \bug This functions doesn't deal with elipsis functions yet, as thery are not handled by
00125  * sem so far
00126  *
00127  * \return filtered list of candidates 
00128  */
00129 ptr< func_decl_set > filter_num_args(ptr< func_decl_set > candidates, decl_list::size_type num_args)
00130 {
00131         ptr< func_decl_set > filtered = func_decl_set::create();
00132 
00133         func_decl_set::iterator it = candidates->begin();
00134         
00135         for(; it != candidates->end(); ++it) {
00136                 if((*it)->parameters_get()->contents_get()->size() == num_args) {
00137                         filtered->insert(*it);
00138                 } else if ((*it)->parameters_get()->contents_get()->size() > num_args) {
00139                         /* FIXME for ps - has_default() ?? 
00140                         if((it->parameters_get()->begin()+num_args)->has_default())
00141                                 filtered->insert(*it);
00142                         */
00143                 }
00144                 /* FIXME - don't know how to get ellipsis yet 
00145                 else if(it->ellipsis_get()) {
00146                         filtered->insert(*it);
00147                 }
00148                 */
00149         }
00150         return filtered;
00151 }
00152 
00153 /*!
00154  * This function returns the viable functions for overload resolution - those functions
00155  * are those having correct number of arguments && those for which's parameters implicit
00156  * conversion sequence from expressions to function parameters exists.
00157  *
00158  * \return set of viable functions
00159  */
00160 ptr< func_decl_set > select_viable(ptr< func_decl_set > candidates, ptr< exprlist > exprs)
00161 {
00162         llog(or_log) << "Filtering according to num of arguments\n";
00163 
00164         ptr< func_decl_set > enough_arg_funcs = filter_num_args(candidates, exprs->size());
00165 
00166         llog(or_log) << "Selected " << enough_arg_funcs->size() << " enough-arg funcs\n";
00167 
00168         return filter_ics_existence(enough_arg_funcs, exprs);
00169 }
00170 
00171 /*!
00172  * This function tests if function f is better (in terms of overload resolution)
00173  * than function g, when considering parameters in expression list exprlist.
00174  *
00175  * \bug tests for templates not done, as templates are not yet supported. tests for user
00176  *      conversions are not done, as user conversions are not yet supported.
00177  *
00178  * \return true if f is better conversion than g, otherwise return false
00179  */
00180 bool is_better_function(ptr< ss_function_declaration > f, ptr< ss_function_declaration > g, ptr< exprlist > exprs)
00181 {
00182         //decl_list::size_type num_args = exprs->size();
00183 
00184         ptr< decl_list > params_f = f->parameters_get()->contents_get();
00185         decl_list::iterator it_f_param = params_f->begin();
00186 
00187         ptr< decl_list > params_g = g->parameters_get()->contents_get();
00188         decl_list::iterator it_g_param = params_g->begin();
00189 
00190         exprlist::iterator it_exprs = exprs->begin();
00191         
00192         
00193         for(; it_f_param != params_f->end() && it_g_param != params_g->end() && it_exprs != exprs->end(); 
00194                         ++it_f_param, ++it_g_param, ++it_exprs) {
00195                 ptr< or_ics_functional > f_func, g_func;
00196 
00197                 f_func = or_find_ics((*it_exprs), (*it_f_param)->type_get());
00198                 g_func = or_find_ics((*it_exprs), (*it_g_param)->type_get());
00199 
00200                 if(!is_not_worse_conv_seq(f_func, (*it_exprs), g_func, (*it_exprs))) {
00201                         return false;
00202                 }
00203         }
00204         for(it_f_param = params_f->begin(), it_g_param = params_g->begin(), it_exprs = exprs->begin(); 
00205                         it_f_param != params_f->end() && it_g_param != params_g->end() && it_exprs != exprs->end(); 
00206                         ++it_f_param, ++it_g_param, ++it_exprs) {
00207                 ptr< or_ics_functional > f_func, g_func;
00208 
00209                 f_func = or_find_ics((*it_exprs), (*it_f_param)->type_get());
00210                 g_func = or_find_ics((*it_exprs), (*it_g_param)->type_get());
00211                 
00212                 if(is_better_conv_seq(f_func, (*it_exprs), g_func, (*it_exprs))){
00213                         return true;
00214                 }
00215         }
00216         /* TODO 
00217          * - f is not template && G is a template specialization instance 
00218          *   && g are templates && f is a better template specialization than g (see 14.5.5.2) 
00219          * - context is inicialization by user conversion  && SCS from return_type(f) -> dest_type is better conv seq 
00220          *   than SCS from return_type(g) -> dest_type
00221          */
00222 
00223         return false;
00224 }
00225 
00226 /*!
00227  * This function selects the best function from set of viable functions. 
00228  * 
00229  * \return The functional, which represents the corresponding funcall, for the
00230  *         selected function.
00231  */
00232 ptr< or_or_functional > best_selection(ptr< func_decl_set > viables, ptr< exprlist > exprs)
00233 {
00234         func_decl_set::iterator it = viables->begin();
00235         ptr< ss_function_declaration > best = *it;
00236         bool was_better = true;
00237 
00238         if (viables->size() == 0) {
00239                 /* there are no candidates */
00240                 return or_or_functional_noviable::create(ss_void::instance());
00241         }
00242         for(++it; it != viables->end(); ++it) {
00243                 if(is_better_function(best, *it, exprs)) {
00244                         llog(or_logger) << "1: true\n";
00245                         was_better = true;
00246                 } else if (is_better_function(*it, best, exprs)) {
00247                         llog(or_logger) << "2: true\n";
00248                         was_better = true;
00249                         best = *it; 
00250                 } else {
00251                         llog(or_logger) << "3: false\n";
00252                         was_better = false;
00253                 }
00254         }
00255 
00256         it = viables->begin();
00257         for(++it; it != viables->end(); ++it) {
00258                 if(!((*it)->equals(best)) && !is_better_function(*it, best, exprs) && !is_better_function(best, *it, exprs))
00259                         return or_or_functional_ambiguous::create(best->type_get().dncast<ss_function>()->returns_get(), viables);
00260         }
00261 
00262         return or_or_functional_concrete::create(best->type_get().dncast<ss_function>()->returns_get(), exprs, best);
00263 }
00264 
00265 /* 
00266  * This function performs lookup for the given operator name. This first means to perform
00267  * usual lookup in the current scope, and then also add declarations of builtin operators,
00268  * as per [13.6]
00269  */
00270 ptr< func_decl_set > collect_candidates(ptr< ss_operator > func_name, ptr< ss_decl_seq > ctxt)
00271 {
00272         ptr< li_func_by_name > lookup = li_func_by_name::create();
00273         ptr< li_func_by_name_in_single_scope > lookup_builtin = li_func_by_name_in_single_scope::create();
00274         ptr< func_decl_set > res_lu, res_builtin;
00275         func_decl_set::iterator it;
00276 
00277         /* lookup the name in the current scope */
00278         llog(or_log) << "Looking it up in the current scope\n";
00279 
00280         res_lu = lookup->process(func_name, ctxt);
00281 
00282         if (res_lu->empty()) {
00283                 llog(or_log) << "Found nothing\n";
00284         }
00285         /* lookup the name in the builtin op scope */
00286         llog(or_log) << "Looking it up in the builtin op scope\n";
00287         res_builtin = lookup_builtin->process(func_name, or_builtin_operator_declaration_creator::instance()->builtin_op_decl_seq_get());
00288 
00289         /* unite the result of the lookup and the result of lookup in builtin decl seq */
00290         if (!res_builtin->empty()) {
00291                 llog(or_log) << "Found something, pushing into return list\n";
00292                 
00293                 it = res_builtin->begin();
00294                 for(; it != res_builtin->end(); it++){
00295                         res_lu->insert(*it);
00296                 }
00297         }
00298         
00299         return res_lu; 
00300 }
00301 
00302 /*!
00303  * This is the main function performing overload resolution algorithm. It
00304  * first collects candidates (performs lookup for function name), selects
00305  * viable functions from these candidates, and then returns best of the
00306  * viable functions found
00307  *
00308  * \bug Koenig lookup not ready yet
00309  *
00310  * \return functional representing the best selected overloaded function
00311  */
00312 
00313 ptr< or_or_functional > overload_resolution (ptr< exprlist > exprs, ptr< ss_operator > func_name)
00314 {
00315         /* search func_name in current context & associated namespaces (exprs) */
00316         /* Rudo will search according to decl_seq and decl_name and returns 
00317          * collection ss_declarations (will have to be dncasted to ss_function_delcaration
00318          */
00319 
00320         ptr< ss_decl_seq > ctxt = sa_context_manager::instance()->current()->ss_get()->scope_get();
00321 
00322         llog(or_log) << "Before collect candidates\n";
00323 
00324         ptr< func_decl_set > candidates = collect_candidates(func_name, ctxt);
00325 
00326         llog(or_log) << "Done, selected " << candidates->size() <<  " candidates\n";
00327 
00328         ptr< func_decl_set > viable_candidates = select_viable(candidates, exprs);
00329 
00330         llog(or_log) << "After viable candidates selection, selected " << viable_candidates->size() << " viable\n";
00331         
00332         /* if no viable functions were found, look if it is not the case of 'there exists builtin
00333          * declaration for every type', which is ',' and some others. See [13.6] and [13.3] for more
00334          * details.
00335          *
00336          * In such case, add the declaration of given ss_operator with current parameters to the decl_seq. 
00337          * This is immediate TODO, just after a few tests.
00338          */
00339         if (viable_candidates->size() == 0) {
00340                 return NULL;
00341         }
00342         return best_selection(viable_candidates, exprs);
00343 }
00344 
00345 /*!
00346  * This is the main function performing overload resolution algorithm. It
00347  * differs from the previous one in the sense of how it is collecting
00348  * candidates - this one receives candidates from "upstream" and then 
00349  * just (will one day) performs Koenig lookup, but the set of candidates
00350  * is given and not obtained using lookup.
00351  *
00352  * This is used in the case of sa_deconstruct_spse::visit_as_expression_function_call,
00353  * for distinguisging the function prefix. See the apropriate comment in there
00354  *
00355  * \bug Koenig lookup not ready yet
00356  *
00357  * \return functional representing the best selected overloaded function
00358  */
00359 
00360 ptr< or_or_functional > overload_resolution (ptr< exprlist > exprs, ptr< func_decl_set > candidates)
00361 {
00362         ptr< func_decl_set > viable_candidates = select_viable(candidates, exprs);
00363 
00364         return best_selection(viable_candidates, exprs);
00365 }
00366 
00367 /* == here the main "high-level" overload resolution implementation ends == */
00368 
00369 /* following is the implementation of visitor on ss_decl_name, which is used for purposes of creating 
00370  * the builtin operator declarations, as specified in [13.6]
00371  */
00372 
00373 /*! 
00374  * this creates the singletonized instance of the creator and also fills the newly created decl_seq with
00375  *  declarations for builtin operators
00376  */
00377 ptr< or_builtin_operator_declaration_creator > or_builtin_operator_declaration_creator::instance() 
00378 {
00379         if (!the_instance) {
00380                 /* before we create the actual ss_builtin_operator declaration, we need to prepare decl_seq, which
00381                  * will contain declarations of parameters and also the operator declarations themselves
00382                  * parameter types are stored in the func_type, however this is still needed (for overload resolution,
00383                  * which is examining these declarations).
00384                  */
00385 
00386                 /* create pair of decl seq and corresponding compound stmt. This is for the operator declaration. */
00387                 ptr< ss_decl_seq > builtin_op_decl_seq = sa_decl_seq_compound_pair_creator::instance()->process(
00388                                                         source_location::zero(),
00389                                                         ss_decl_seq::root_instance(),
00390                                                         ss_compound_stmt::root_instance()
00391                                                 )->first;
00392                 builtin_op_decl_seq->dump_barrier_set(true);
00393                 /* 2.1. create fake declaration and make the newly created ss_decl_seq to be declared
00394                  * by this declaration. This fake declaration is contained in root decl seq
00395                  */ 
00396                 ptr<ss_declaration> gl_decl = ss_namespace_definition::create(source_location::zero(), ss_declaration_time::infinity(), ss_declaration_time::create(0),
00397                                                 ss_dummy_name::create(source_location::zero()), ss_decl_seq::root_instance(), ss_void::instance(), 
00398                                                 ss_linkage::create("C++", ss_linkage::LINKAGE_NO), builtin_op_decl_seq );
00399                 builtin_op_decl_seq->declared_by_set( gl_decl );
00400                 ss_decl_seq::root_instance()->contents_get()->push_back( gl_decl );
00401 
00402                 the_instance = new or_builtin_operator_declaration_creator(builtin_op_decl_seq);
00403 
00404                 /* Some of the thing described in [13.6] and [13] generally have to be added later. This means those, which
00405                  * take place 'for every type', so just adding them later to the list of candidates, with current types,
00406                  * is OK, when no else viable functions are found.
00407                  */
00408 
00409                 BUILTIN_DECL_SEQ_INIT();
00410 
00411                 /* we do not want this decl_seq to be incorporated in the dump. It's 15 mb of nothing :) */
00412 
00413         }
00414 
00415         return the_instance;
00416 }
00417 
00418 /*! 
00419  * This template performs creation of builtin operator declaration. The template argument OP specifies the 
00420  * ss_decl_name of the operator for which the declaration must be created. The function parameter types 
00421  * contains list of types, which should the arguments have. Note, that this is different from the types
00422  * obtained from arguments_get->begin() (which is or_or_functional) - this represents the actual parameters
00423  * (and their types) in the actual call (and for which the conversion is being searched for during overload
00424  * resolution)
00425  */
00426 void or_builtin_operator_declaration_creator::construct_builtin_op(ptr< ss_decl_name > op, ptr< ::lestes::std::list< srp< ss_type > > > types, ptr< ss_type > return_type)
00427 {
00428         typedef ::lestes::std::list< srp< ss_type > > typelist;
00429         typedef ::lestes::std::set< srp< ss_struct_base > > structlist;
00430         ::lestes::std::list< srp< ss_type > >::iterator it_d = types->begin(); /* _d for declaration */
00431         ptr< typelist > paramlist = types;
00432         ptr< structlist > friend_of = structlist::create();
00433         ptr< ss_decl_seq > parameter_decls;
00434         
00435         /* the actual ss_function creation */
00436         ptr< ss_type > func_type = ss_function::instance(return_type, paramlist, false);
00437         
00438 
00439         /* 1.2 create pair of decl seq and corresponding compound stmt. This is for the operator parameters. */
00440         ptr< ss_decl_seq > builtin_op_params_decl_seq = sa_decl_seq_compound_pair_creator::instance()->process(
00441                                                         source_location::zero(),
00442                                                         ss_decl_seq::root_instance(),
00443                                                         ss_compound_stmt::root_instance()
00444                                                 )->first;
00445 
00446 
00447         /* 3. create dummy ss_decl_name for the parameter */
00448         ptr< ss_dummy_name > param_name = ss_dummy_name::create(source_location::zero());
00449 
00450         lint pos = 1;
00451         for(; it_d != types->end(); it_d++, pos++) {
00452                 /* 4. once we have decl_seq and corresponding (empty) statement, creation of declarations for parameters must be done */
00453                 ptr< ss_parameter_declaration > p_decl = ss_parameter_declaration::create       (
00454                                                                 source_location::zero(),                                /* location */
00455                                                                 ss_declaration_time::create(source_location::zero()->order_get()), /* visible since */
00456                                                                 ss_declaration_time::create(source_location::zero()->order_get()), /* declaration time */
00457                                                                 param_name,                                     /* ss_decl_name */
00458                                                                 builtin_op_params_decl_seq,                     /* contained-in declseq */
00459                                                                 *it_d,                                          /* ss_type */
00460                                                                 ss_linkage::create("C++", ss_linkage::LINKAGE_EXTERNAL), /* linkage */
00461                                                                 ss_declaration_time::infinity(),                /* initialized since */
00462                                                                 NULL,                                           /* initializer */
00463                                                                 pos                                             /* position */
00464                                                         );
00465                 builtin_op_params_decl_seq->contents_get()->push_back(p_decl);
00466         }
00467 
00468         ptr< ss_builtin_operator_declaration > op_decl = ss_builtin_operator_declaration::create        (
00469                                                         source_location::zero(),                                /* location */
00470                                                         ss_declaration_time::create(source_location::zero()->order_get()), /* visible since */
00471                                                         ss_declaration_time::create(source_location::zero()->order_get()), /* declaration time */
00472                                                         op,                                             /* ss_decl_name */
00473                                                         builtin_op_decl_seq,/* contained-in declseq */
00474                                                         func_type,                                      /* ss_type (ss_function) */
00475                                                         ss_linkage::create("C++", ss_linkage::LINKAGE_EXTERNAL), /* linkage */
00476                                                         builtin_op_params_decl_seq,                     /* ss_decl_seq(??) parameters */
00477                                                         NULL                                            /* body. check="" */
00478                                                 );
00479         /* the decl_seq for parameters is declared by the builtin op declaration */
00480         builtin_op_params_decl_seq->declared_by_set(op_decl);
00481         /* add the declaration of the op to the builtin op decl seq */
00482         builtin_op_decl_seq->contents_get()->push_back(op_decl);
00483 }
00484 
00485 /*!
00486  * or_buitlin_operator_declaration_creator is visitor only because of a historic reasons, should be removed
00487  */ 
00488 void or_builtin_operator_declaration_creator::visit_ss_operator_assign( ptr< ss_operator_assign >)
00489 {       
00490 }
00491 
00492 void or_builtin_operator_declaration_creator::visit_ss_operator_comma( ptr< ss_operator_comma > )
00493 {
00494 }
00495 
00496 void or_builtin_operator_declaration_creator::visit_ss_dummy_name( ptr< ss_dummy_name> )
00497 {
00498 }
00499 
00500 void or_builtin_operator_declaration_creator::visit_ss_operator_function_call( ptr< ss_operator_function_call >)
00501 {
00502 }
00503 
00504 void or_builtin_operator_declaration_creator::visit_ss_operator_array( ptr< ss_operator_array >)
00505 {
00506 }
00507 
00508 void or_builtin_operator_declaration_creator::visit_ss_operator_access( ptr< ss_operator_access >)
00509 {
00510 }
00511 void or_builtin_operator_declaration_creator::visit_ss_operator_access_member( ptr< ss_operator_access_member >)
00512 {
00513 }
00514 
00515 void or_builtin_operator_declaration_creator::visit_ss_operator_land( ptr< ss_operator_land >)
00516 {
00517 }
00518 
00519 void or_builtin_operator_declaration_creator::visit_ss_operator_lor( ptr< ss_operator_lor >)
00520 {
00521 }
00522 
00523 void or_builtin_operator_declaration_creator::visit_ss_operator_ternary( ptr< ss_operator_ternary >)
00524 {
00525 }
00526 
00527 void or_builtin_operator_declaration_creator::visit_ss_ordinary_name( ptr< ss_ordinary_name >)
00528 {
00529 }
00530 
00531 void or_builtin_operator_declaration_creator::visit_ss_conversion_name( ptr< ss_conversion_name >)
00532 {
00533 }
00534 void or_builtin_operator_declaration_creator::visit_ss_operator_new( ptr< ss_operator_new >)
00535 {
00536 }
00537 
00538 void or_builtin_operator_declaration_creator::visit_ss_operator_delete( ptr< ss_operator_delete >)
00539 {
00540 }
00541 
00542 void or_builtin_operator_declaration_creator::visit_ss_operator_new_array( ptr< ss_operator_new_array >)
00543 {
00544 }
00545 
00546 void or_builtin_operator_declaration_creator::visit_ss_operator_delete_array( ptr< ss_operator_delete_array >)
00547 {
00548 }
00549 void or_builtin_operator_declaration_creator::visit_ss_operator_add( ptr< ss_operator_add >)
00550 {
00551 }
00552 
00553 void or_builtin_operator_declaration_creator::visit_ss_operator_sub( ptr< ss_operator_sub >)
00554 {
00555 }
00556 
00557 void or_builtin_operator_declaration_creator::visit_ss_operator_mul( ptr< ss_operator_mul >)
00558 {
00559 }
00560 
00561 void or_builtin_operator_declaration_creator::visit_ss_operator_div( ptr< ss_operator_div >)
00562 {
00563 }
00564 
00565 void or_builtin_operator_declaration_creator::visit_ss_operator_mod( ptr< ss_operator_mod >)
00566 {
00567 }
00568 
00569 void or_builtin_operator_declaration_creator::visit_ss_operator_bxor( ptr< ss_operator_bxor >)
00570 {
00571 }
00572 
00573 void or_builtin_operator_declaration_creator::visit_ss_operator_band( ptr< ss_operator_band >)
00574 {
00575 }
00576 
00577 void or_builtin_operator_declaration_creator::visit_ss_operator_bor( ptr< ss_operator_bor >)
00578 {
00579 }
00580 void or_builtin_operator_declaration_creator::visit_ss_operator_shr( ptr< ss_operator_shr >)
00581 {
00582 }
00583 
00584 void or_builtin_operator_declaration_creator::visit_ss_operator_shl( ptr< ss_operator_shl >)
00585 {
00586 }
00587 
00588 void or_builtin_operator_declaration_creator::visit_ss_operator_sbl( ptr< ss_operator_sbl >)
00589 {
00590 }
00591 
00592 void or_builtin_operator_declaration_creator::visit_ss_operator_sbg( ptr< ss_operator_sbg >)
00593 {
00594 }
00595 
00596 void or_builtin_operator_declaration_creator::visit_ss_operator_sbng( ptr< ss_operator_sbng >)
00597 {
00598 }
00599 
00600 void or_builtin_operator_declaration_creator::visit_ss_operator_sbnl( ptr< ss_operator_sbnl >)
00601 {
00602 }
00603 
00604 void or_builtin_operator_declaration_creator::visit_ss_operator_sbe( ptr< ss_operator_sbe >)
00605 {
00606 }
00607 
00608 void or_builtin_operator_declaration_creator::visit_ss_operator_sbne( ptr< ss_operator_sbne >)
00609 {
00610 }
00611 void or_builtin_operator_declaration_creator::visit_ss_operator_bnot( ptr< ss_operator_bnot >)
00612 {
00613 }
00614 
00615 void or_builtin_operator_declaration_creator::visit_ss_operator_lnot( ptr< ss_operator_lnot >)
00616 {
00617 }
00618 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_add( ptr< ss_operator_assign_add >)
00619 {
00620 }
00621 
00622 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_sub( ptr< ss_operator_assign_sub >)
00623 {
00624 }
00625 
00626 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_mul( ptr< ss_operator_assign_mul >)
00627 {
00628 }
00629 
00630 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_div( ptr< ss_operator_assign_div >)
00631 {
00632 }
00633 
00634 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_mod( ptr< ss_operator_assign_mod >)
00635 {
00636 }
00637 
00638 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_bxor( ptr< ss_operator_assign_bxor >)
00639 {
00640 }
00641 
00642 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_band( ptr< ss_operator_assign_band >)
00643 {
00644 }
00645 
00646 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_bor( ptr< ss_operator_assign_bor >)
00647 {
00648 }
00649 
00650 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_shl( ptr< ss_operator_assign_shl >)
00651 {
00652 }
00653 
00654 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_shr( ptr< ss_operator_assign_shr >)
00655 {
00656 }
00657 void or_builtin_operator_declaration_creator::visit_ss_operator_inc( ptr< ss_operator_inc >)
00658 {
00659 }
00660 
00661 void or_builtin_operator_declaration_creator::visit_ss_operator_dec( ptr< ss_operator_dec >)
00662 {
00663 }
00664 
00665 end_package(sem);
00666 end_package(cplus);
00667 end_package(lang);
00668 end_package(lestes);
00669 

Generated on Mon Feb 12 18:22:42 2007 for lestes by doxygen 1.5.1-20070107