return *this;
}
- function_options & set_return_type(unsigned rt, tinfo_t rtt=NULL);
+ function_options & set_return_type(unsigned rt, const return_type_t* rtt = 0);
function_options & do_not_evalf_params();
function_options & remember(unsigned size, unsigned assoc_size=0,
unsigned strategy=remember_strategies::delete_never);
bool use_return_type;
unsigned return_type;
- tinfo_t return_type_tinfo;
+ return_type_t return_type_tinfo;
bool use_remember;
unsigned remember_size;
bool is_equal_same_type(const basic & other) const;
bool match_same_type(const basic & other) const;
unsigned return_type() const;
- tinfo_t return_type_tinfo() const;
+ return_type_t return_type_tinfo() const;
// new virtual functions which can be overridden by derived classes
// none
return *this;
}
-function_options & function_options::set_return_type(unsigned rt, tinfo_t rtt)
+function_options & function_options::set_return_type(unsigned rt, const return_type_t* rtt)
{
use_return_type = true;
return_type = rt;
- return_type_tinfo = rtt;
+ if (rtt != 0)
+ return_type_tinfo = *rtt;
+ else
+ return_type_tinfo = make_return_type_t<function>();
return *this;
}
}
}
-tinfo_t function::return_type_tinfo() const
+return_type_t function::return_type_tinfo() const
{
GINAC_ASSERT(serial<registered_functions().size());
const function_options &opt = registered_functions()[serial];
// 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 this;
+ return make_return_type_t<function>();
else
return seq.begin()->return_type_tinfo();
}