On 13 September 2018 at 19:36, Jason Merrill <ja...@redhat.com> wrote: > On Thu, Sep 13, 2018 at 9:41 AM, Ville Voutilainen > <ville.voutilai...@gmail.com> wrote: >> On 13 September 2018 at 13:41, Ville Voutilainen >> <ville.voutilai...@gmail.com> wrote: >>>> How does this work when: >>>> unsigned has_complex_copy_ctor : 1; >>> It doesn't. I need more bits. Luckily, we have some available. >> >> Here. I suppose this could theoretically be done in some later stage >> of class completion, >> but that would presumably be an additional member function loop that >> looks at the constructors, >> weeds out copy constructors, and calculates the triviality bit (and it >> should probably then also >> look at fields and bases, again). So while I continue to have a minor >> distaste for this whole approach, >> and how it wastes two perfectly good bits for a dark corner case, I >> think I can learn to live with it. > > Really, the problem is that trivial_fn_p shouldn't use > type_has_trivial_fn, and also that the function named > "type_has_trivial_fn" actually returns "type has no non-trivial fn". > These flags are relics of C++98 semantics. Your test should also > check that !__is_trivially_constructible(M,M&) and > !__is_trivially_constructible(M2,M2&).
Yeah, this patch doesn't handle those trivialities correctly, that needs further work. > I suppose that given the limited number of possibly trivial > signatures, we can still use flag bits on the class, as your patch is > heading toward: one bit for each of the possibly trivial signatures, > and TYPE_HAS_COMPLEX_COPY_CTOR; then TYPE_HAS_COPY_CTOR is the union > of these. And similarly for the other possibly trivial functions. Okay. Do you think we should have an sfk_kind for non-canonical copy/move operations? That would presumably make it a tad more straightforward to go from fndecl to whatever class bits, instead of what's currently there, where we say "yeah I had a fndecl, now I turned it into an sfk_kind that says it's a copy constructor, but guess which one when you're deeming its triviality". ;)