This is the mail archive of the
gdb-cvs@sourceware.org
mailing list for the GDB project.
[binutils-gdb] gdb: make_scoped_restore and types convertible to T
- From: Pedro Alves <palves at sourceware dot org>
- To: gdb-cvs at sourceware dot org
- Date: 31 Jan 2017 23:37:12 -0000
- Subject: [binutils-gdb] gdb: make_scoped_restore and types convertible to T
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=60adb36c08942fd4a2f8bf598864254c043668a1
commit 60adb36c08942fd4a2f8bf598864254c043668a1
Author: Pedro Alves <palves@redhat.com>
Date: Tue Jan 31 17:56:35 2017 +0000
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.
Diff:
---
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 327b327..3e86d55 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
Richard Henderson <rth@redhat.com>
diff --git a/gdb/common/scoped_restore.h b/gdb/common/scoped_restore.h
index 0c8c30d..ae7a49f 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 <typename T2>
+ scoped_restore_tmpl (T *var, T2 value)
: m_saved_var (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
argument deduction work. */
-template<typename T>
-scoped_restore_tmpl<T> make_scoped_restore (T *var, T value)
+template<typename T, typename T2>
+scoped_restore_tmpl<T> make_scoped_restore (T *var, T2 value)
{
return scoped_restore_tmpl<T> (var, value);
}