From patchwork Tue Jan 17 01:39:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 18920 Received: (qmail 100264 invoked by alias); 17 Jan 2017 01:39:12 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 100231 invoked by uid 89); 17 Jan 2017 01:39:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-5.1 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=VALUE, str_file, save_stdout, sk:make_sc X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 17 Jan 2017 01:39:10 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8BA0E7F09D for ; Tue, 17 Jan 2017 01:39:10 +0000 (UTC) Received: from cascais.lan (ovpn04.gateway.prod.ext.phx2.redhat.com [10.5.9.4]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v0H1d8jk024262 for ; Mon, 16 Jan 2017 20:39:10 -0500 From: Pedro Alves 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:03 +0000 Message-Id: <1484617147-2506-2-git-send-email-palves@redhat.com> In-Reply-To: <1484617147-2506-1-git-send-email-palves@redhat.com> References: <1484617147-2506-1-git-send-email-palves@redhat.com> MIME-Version: 1.0 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 scoped_restore_tmpl make_scoped_restore(T*, T) scoped_restore_tmpl 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 * 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 + scoped_restore_tmpl (T *var, T2 value) : m_saved_var (var), m_saved_value (*var) { @@ -90,8 +93,8 @@ scoped_restore_tmpl make_scoped_restore (T *var) /* Make a scoped_restore. This is useful because it lets template argument deduction work. */ -template -scoped_restore_tmpl make_scoped_restore (T *var, T value) +template +scoped_restore_tmpl make_scoped_restore (T *var, T2 value) { return scoped_restore_tmpl (var, value); }