From 60adb36c08942fd4a2f8bf598864254c043668a1 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 31 Jan 2017 17:56:35 +0000 Subject: [PATCH] gdb: make_scoped_restore and types convertible to T MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 scoped_restore_tmpl make_scoped_restore(T*, T) scoped_restore_tmpl 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 * 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. --- gdb/ChangeLog | 7 +++++++ gdb/common/scoped_restore.h | 11 +++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 327b327fdd..3e86d55066 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2017-01-31 Pedro Alves + + * 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 Richard Henderson diff --git a/gdb/common/scoped_restore.h b/gdb/common/scoped_restore.h index 0c8c30dcc8..ae7a49f00b 100644 --- a/gdb/common/scoped_restore.h +++ b/gdb/common/scoped_restore.h @@ -47,8 +47,11 @@ class scoped_restore_tmpl : public scoped_restore_base /* Create a new scoped_restore object that saves the current value of *VAR, and sets *VAR to VALUE. *VAR will be restored when this - scoped_restore object is destroyed. */ - scoped_restore_tmpl (T *var, T value) + scoped_restore object is destroyed. This is templated on T2 to + allow passing VALUEs of types convertible to T. + E.g.: T='base'; T2='derived'. */ + template + scoped_restore_tmpl (T *var, T2 value) : m_saved_var (var), m_saved_value (*var) { @@ -90,8 +93,8 @@ scoped_restore_tmpl make_scoped_restore (T *var) /* Make a scoped_restore. This is useful because it lets template argument deduction work. */ -template -scoped_restore_tmpl make_scoped_restore (T *var, T value) +template +scoped_restore_tmpl make_scoped_restore (T *var, T2 value) { return scoped_restore_tmpl (var, value); }