gdb: make_scoped_restore and types convertible to T
authorPedro Alves <palves@redhat.com>
Tue, 31 Jan 2017 17:56:35 +0000 (17:56 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 31 Jan 2017 17:56:35 +0000 (17:56 +0000)
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.

gdb/ChangeLog
gdb/common/scoped_restore.h

index 327b327fdd1c51b8c07589973f6a3b5e42189932..3e86d550663c21cd05845856104bdeca2b0d0432 100644 (file)
@@ -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>
 
index 0c8c30dcc82d3e46c655429b21b4902fd435bc1a..ae7a49f00b9647c1e8c0b2b4b015635f82a99466 100644 (file)
@@ -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);
 }