Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 1/5] gdb: make_scoped_restore and types convertible to T
Date: Tue, 17 Jan 2017 01:39:00 -0000	[thread overview]
Message-ID: <1484617147-2506-2-git-send-email-palves@redhat.com> (raw)
In-Reply-To: <1484617147-2506-1-git-send-email-palves@redhat.com>

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-17  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/common/scoped_restore.h | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

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


  parent reply	other threads:[~2017-01-17  1:39 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-17  1:39 [PATCH 0/5] Eliminate cleanups & make ui_file a C++ class hierarchy Pedro Alves
2017-01-17  1:39 ` [PATCH 2/5] gdb/varobj.c: Fix leak Pedro Alves
2017-01-17  1:39 ` [PATCH 5/5] Eliminate make_cleanup_ui_file_delete / make ui_file a class hierarchy Pedro Alves
2017-01-17 19:57   ` Simon Marchi
2017-01-17 19:58     ` Simon Marchi
2017-01-23 16:58     ` Pedro Alves
2017-01-23 17:17       ` Pedro Alves
2017-01-23 19:18       ` Simon Marchi
2017-01-23 23:19         ` [PATCH v2 " Pedro Alves
2017-01-24 18:29           ` Simon Marchi
2017-01-24 19:14             ` Simon Marchi
2017-01-25 18:37               ` Pedro Alves
2017-01-25 17:52             ` Pedro Alves
2017-01-25 19:31               ` Pedro Alves
2017-01-25 19:47                 ` [PATCH v3 " Pedro Alves
2017-02-01  0:31                   ` Pedro Alves
2017-01-25 18:27             ` [PATCH v2 " Pedro Alves
2017-01-24 19:11           ` Simon Marchi
2017-01-25 18:28             ` Pedro Alves
2017-01-25 18:39               ` Simon Marchi
2017-01-25 18:41                 ` Pedro Alves
2017-01-17  1:39 ` Pedro Alves [this message]
2017-01-17  1:39 ` [PATCH 3/5] gdb/stack.c: Remove unused mem_fileopen Pedro Alves
2017-01-17  1:47 ` [PATCH 4/5] gdb/mi/mi-interp.c: Fix typos Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1484617147-2506-2-git-send-email-palves@redhat.com \
    --to=palves@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox