gdb: make_scoped_restore and types convertible to T
A following patch will want to do string_file str_file; scoped_restore save_stdout = make_scoped_restore (&gdb_stdout, &str_file); where gdb_stdout is a ui_file *, and string_file is a type that inherits from ui_file, but that doesn't compile today: src/gdb/top.c: In function ‘std::__cxx11::string execute_command_to_string(char*, int)’: src/gdb/top.c:710:50: error: no matching function for call to ‘make_scoped_restore(ui_file**, string_file*)’ = make_scoped_restore (&gdb_stdout, &str_file); ^ [...] In file included from src/gdb/utils.h:25:0, from src/gdb/defs.h:732, from src/gdb/top.c:20: src/gdb/common/scoped_restore.h:94:24: note: candidate: template<class T> scoped_restore_tmpl<T> make_scoped_restore(T*, T) scoped_restore_tmpl<T> make_scoped_restore (T *var, T value) ^ src/gdb/common/scoped_restore.h:94:24: note: template argument deduction/substitution failed: src/gdb/top.c:710:50: note: deduced conflicting types for parameter ‘T’ (‘ui_file*’ and ‘string_file*’) = make_scoped_restore (&gdb_stdout, &str_file); ^ This commit makes code such as the above possible. gdb/ChangeLog: 2017-01-31 Pedro Alves <palves@redhat.com> * common/scoped_restore.h (scoped_restore_tmpl::scoped_restore_tmpl): Template on T2, and change the value's parameter type to T2. (make_scoped_restore): Likewise.
This commit is contained in:
parent
1273da0414
commit
60adb36c08
|
@ -1,3 +1,10 @@
|
||||||
|
2017-01-31 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* common/scoped_restore.h
|
||||||
|
(scoped_restore_tmpl::scoped_restore_tmpl): Template on T2, and
|
||||||
|
change the value's parameter type to T2.
|
||||||
|
(make_scoped_restore): Likewise.
|
||||||
|
|
||||||
2017-01-27 Walfred Tedeschi <walfred.tedeschi@intel.com>
|
2017-01-27 Walfred Tedeschi <walfred.tedeschi@intel.com>
|
||||||
Richard Henderson <rth@redhat.com>
|
Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,11 @@ class scoped_restore_tmpl : public scoped_restore_base
|
||||||
|
|
||||||
/* Create a new scoped_restore object that saves the current value
|
/* Create a new scoped_restore object that saves the current value
|
||||||
of *VAR, and sets *VAR to VALUE. *VAR will be restored when this
|
of *VAR, and sets *VAR to VALUE. *VAR will be restored when this
|
||||||
scoped_restore object is destroyed. */
|
scoped_restore object is destroyed. This is templated on T2 to
|
||||||
scoped_restore_tmpl (T *var, T value)
|
allow passing VALUEs of types convertible to T.
|
||||||
|
E.g.: T='base'; T2='derived'. */
|
||||||
|
template <typename T2>
|
||||||
|
scoped_restore_tmpl (T *var, T2 value)
|
||||||
: m_saved_var (var),
|
: m_saved_var (var),
|
||||||
m_saved_value (*var)
|
m_saved_value (*var)
|
||||||
{
|
{
|
||||||
|
@ -90,8 +93,8 @@ scoped_restore_tmpl<T> make_scoped_restore (T *var)
|
||||||
|
|
||||||
/* Make a scoped_restore. This is useful because it lets template
|
/* Make a scoped_restore. This is useful because it lets template
|
||||||
argument deduction work. */
|
argument deduction work. */
|
||||||
template<typename T>
|
template<typename T, typename T2>
|
||||||
scoped_restore_tmpl<T> make_scoped_restore (T *var, T value)
|
scoped_restore_tmpl<T> make_scoped_restore (T *var, T2 value)
|
||||||
{
|
{
|
||||||
return scoped_restore_tmpl<T> (var, value);
|
return scoped_restore_tmpl<T> (var, value);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue