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
next prev 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