From: Pedro Alves <palves@redhat.com>
To: Tom Tromey <tom@tromey.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFA 1/8] Add gdb_ref_ptr.h
Date: Fri, 02 Dec 2016 23:45:00 -0000 [thread overview]
Message-ID: <ef20f327-7ecd-9790-5a4a-9fd89ccf6aa7@redhat.com> (raw)
In-Reply-To: <87k2bi85x8.fsf@tromey.com>
On 12/02/2016 07:52 PM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
>
> Pedro> I think gcc will list you all candidates, mentioning why each one
> Pedro> can't work. I.e., it likely tells you more further below?
>
> Yeah, it does, I missed that.
Ah, trying locally and getting at the compile log helped. The overload
we'd expect to work, doesn't:
..../src/gdb/solib-darwin.c: In function ‘void darwin_solib_get_all_image_info_addr_at_init(darwin_info*)’:
..../src/gdb/solib-darwin.c:467:16: error: no match for ‘operator!=’ (operand types are ‘gdb_bfd_ref_ptr {aka gdb::ref_ptr<bfd, gdb_bfd_ref_policy>}’ and ‘long int’)
if (dyld_bfd != NULL)
^
[...]
..../src/gdb/common/gdb_ref_ptr.h:212:13: note: candidate: template<class T, class POLICY> bool gdb::operator!=(const gdb::ref_ptr<T, POLICY>&, const T*)
inline bool operator!= (const ref_ptr<T, POLICY> &self, const T *other)
^
..../src/gdb/common/gdb_ref_ptr.h:212:13: note: template argument deduction/substitution failed:
..../src/gdb/solib-darwin.c:467:19: note: mismatched types ‘const T*’ and ‘long int’
if (dyld_bfd != NULL)
^
[...]
That's simply because template type deduction, which happens
before overload resolution, does not consider implicit conversions.
And then there's no overload in the overload set that satisfied
the operation.
Before the gdb_ref_ptr.h patch (this email thread), gdbpy_ref
is not a template, so:
inline bool operator!= (const gdbpy_ref &self, const PyObject *other);
is left in the overload set, at which point implicit conversions can
apply.
I was a bit mystified about why my gdb_unique_ptr shim had == NULL
working without nullptr_t overloads, but I remember now. It was
because it was using the safe bool idiom to make it work. I.e.,
adding this to ref_ptr would make operator==/operator!= work without
the nullptr_t overloads too:
/* "explicit operator bool ()" emulation using the safe bool
idiom. */
private:
typedef void (ref_ptr::*explicit_operator_bool) () const;
void this_type_does_not_support_comparisons () const {}
public:
operator explicit_operator_bool () const
{
return (m_obj != NULL
? &ref_ptr::this_type_does_not_support_comparisons
: 0);
}
With this, despite the fact that no operator== candidate template
matches, the compile still manages to call the built-in, non-template:
bool operator==(member function ptr, long);
> Pedro> Do you have your code in some branch? It seems none of the
> Pedro> gdbpy_ref stuff is in master yet.
>
> I pushed it to py-cxx-changes on my github account.
Thanks, that helped.
So the conclusion is that the nullptr_t overloads are necessary because
ref_ptr is now a template.
BTW, notice that both retain_ptr (that proposal I linked to), and unique_ptr
have these same overloads.
Thanks,
Pedro Alves
next prev parent reply other threads:[~2016-12-02 23:45 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-29 5:06 [RFA 0/8] C++-ification series #5 Tom Tromey
2016-11-29 5:06 ` [RFA 4/8] Remove make_cleanup_discard_psymtabs Tom Tromey
2016-12-02 14:21 ` Pedro Alves
2016-11-29 5:06 ` [RFA 7/8] Use unique_xmalloc_ptr in execute_gdb_command Tom Tromey
2016-11-29 5:22 ` Tom Tromey
2016-12-15 3:49 ` Tom Tromey
2016-12-20 17:48 ` Pedro Alves
2016-12-20 18:13 ` Tom Tromey
2016-12-23 20:01 ` Tom Tromey
2017-01-10 17:59 ` Pedro Alves
2017-01-10 19:22 ` Tom Tromey
2016-12-20 23:31 ` Tom Tromey
2016-12-20 23:56 ` Pedro Alves
2016-12-22 14:50 ` Tom Tromey
2016-12-22 15:09 ` Pedro Alves
2016-12-22 15:29 ` Tom Tromey
2016-12-22 15:40 ` Pedro Alves
2016-12-02 14:49 ` Pedro Alves
2016-12-13 13:30 ` Tom Tromey
2016-11-29 5:06 ` [RFA 3/8] Introduce and use gdb::unlinker Tom Tromey
2016-12-02 13:17 ` Pedro Alves
2016-11-29 5:06 ` [RFA 5/8] Add value_freer Tom Tromey
2016-12-02 14:24 ` Pedro Alves
2016-11-29 5:06 ` [RFA 2/8] Use class to manage BFD reference counts Tom Tromey
2016-12-02 13:05 ` Pedro Alves
2016-12-13 13:26 ` Tom Tromey
2016-12-15 4:12 ` Tom Tromey
2016-12-20 18:18 ` Pedro Alves
2016-12-20 17:19 ` [pushed] gdb: Constify solib_find (Re: [RFA 2/8] Use class to manage BFD reference counts) Pedro Alves
2016-12-20 18:05 ` Tom Tromey
2016-11-29 5:06 ` [RFA 6/8] Use value_freer in dwarf2_evaluate_loc_desc_full Tom Tromey
2016-12-02 14:45 ` Pedro Alves
2016-12-13 13:29 ` Tom Tromey
2016-12-20 14:49 ` Pedro Alves
2016-12-23 19:05 ` Tom Tromey
2016-12-23 19:59 ` Tom Tromey
2017-01-10 17:58 ` Pedro Alves
2016-12-23 19:59 ` Tom Tromey
2017-01-10 17:57 ` Pedro Alves
2016-11-29 5:06 ` [RFA 8/8] Add constructor and destructor to demangle_parse_info Tom Tromey
2016-12-02 15:04 ` Pedro Alves
2016-12-13 13:50 ` Tom Tromey
2016-11-29 5:06 ` [RFA 1/8] Add gdb_ref_ptr.h Tom Tromey
2016-12-02 13:08 ` Pedro Alves
2016-12-02 17:46 ` Tom Tromey
2016-12-02 18:11 ` Pedro Alves
2016-12-02 19:52 ` Tom Tromey
2016-12-02 23:45 ` Pedro Alves [this message]
2016-12-03 0:05 ` Pedro Alves
2016-12-13 13:13 ` Tom Tromey
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=ef20f327-7ecd-9790-5a4a-9fd89ccf6aa7@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tom@tromey.com \
/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