This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]