X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Ffunction.pl;h=760252748775130c3db0331776c131e1a0cef96c;hp=bc46d710ad3355dd4f4e4ee64e72d8ad6900513a;hb=82fd1a4ad2f5d58a502a2ccc71be45093b282fea;hpb=9bd9839011ad4f18604599a42a0fbe6de65ac2d0 diff --git a/ginac/function.pl b/ginac/function.pl index bc46d710..76025274 100755 --- a/ginac/function.pl +++ b/ginac/function.pl @@ -504,7 +504,6 @@ function_options& function_options::series_func(series_funcp_exvector s) return *this; } - function_options & function_options::set_return_type(unsigned rt, unsigned rtt) { use_return_type = true; @@ -913,18 +912,36 @@ bool function::match_same_type(const basic & other) const unsigned function::return_type(void) const { - if (seq.empty()) - return return_types::commutative; - else - return seq.begin()->return_type(); + const function_options &opt = registered_functions()[serial]; + + if (opt.use_return_type) { + // Return type was explicitly specified + return opt.return_type; + } else { + // Default behavior is to use the return type of the first + // argument. Thus, exp() of a matrix behaves like a matrix, etc. + if (seq.empty()) + return return_types::commutative; + else + return seq.begin()->return_type(); + } } unsigned function::return_type_tinfo(void) const { - if (seq.empty()) - return tinfo_key; - else - return seq.begin()->return_type_tinfo(); + const function_options &opt = registered_functions()[serial]; + + if (opt.use_return_type) { + // Return type was explicitly specified + return opt.return_type_tinfo; + } else { + // Default behavior is to use the return type of the first + // argument. Thus, exp() of a matrix behaves like a matrix, etc. + if (seq.empty()) + return tinfo_key; + else + return seq.begin()->return_type_tinfo(); + } } //////////