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)
commit60adb36c08942fd4a2f8bf598864254c043668a1
tree1ee9ea12a16283ab6788c6a9a1f6999806064110
parent1273da0414a2f2a31288749a17fe44cbef615ab5
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.
gdb/ChangeLog
gdb/common/scoped_restore.h