This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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] |
On Wed, Jan 11, 2017 at 10:53 AM, Nathan Sidwell <nathan@acm.org> wrote: > On 01/04/2017 12:53 AM, Jason Merrill wrote: > >> Hmm, that seems like where the problem is. We shouldn't try to >> instantiate the inheriting constructor until we've already chosen the >> base constructor; in the new model the inheriting constructor is just an >> implementation detail. > > Oh what fun. This testcase behaves differently for C++17, C++11 > -fnew-inheriting-ctors and C++11 -fno-new-inheriting-ctors compilation > modes. > > Firstly, unpatched G++ is fine in C++17 mode, because: > /* In C++17, "If the initializer expression is a prvalue and the > cv-unqualified version of the source type is the same class as the > class > of the destination, the initializer expression is used to initialize > the > destination object." Handle that here to avoid doing overload > resolution. */ > and inside that we have: > > /* FIXME P0135 doesn't say how to handle direct initialization from a > type with a suitable conversion operator. Let's handle it like > copy-initialization, but allowing explict conversions. */ > > That conversion lookup short-circuits the subsequent overload resolution > that would otherwise explode. > > Otherwise, with -fnew-inheriting-ctors, you are indeed correct. There needs > to be a call to strip_inheriting_ctors in deduce_inheriting_ctor. That doesn't seem quite right; in deducing the inheriting ctor we are interested in what it actually calls, so we don't want to strip. I was thinking about changing when we do that deduction: we shouldn't be calling deduce_inheriting_ctor until we actually know we're calling this inheriting ctor. I was thinking that would mean removing the code in fn_type_unification with the comment /* After doing deduction with the inherited constructor, actually return an instantiation of the inheriting constructor. */ and then looking up the inheriting constructor somehow in build_over_call. But that gets to be a big change. Something smaller would be moving the call to deduce_inheriting_ctor to build_over_call; we can get away with that because calling is the only way to refer to a constructor. What do you think of this approach?
Attachment:
deduce-later.diff
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |