[PATCH] warn on mem calls modifying objects of non-trivial types (PR 80560)

Martin Sebor msebor@gmail.com
Mon Jun 5 16:07:00 GMT 2017


>>> Maybe I should use a different approach and instead of trying
>>> to see if a function is deleted use trivially_xible to see if
>>> it's usable.  That will mean changing the diagnostics from
>>> "with a deleted special function" to "without trivial special
>>> function" but it will avoid calling synthesized_method_walk
>>> while still avoiding giving bogus suggestions.
>
> Actually, this would check for one possible argument type and not
> others, so I think it's better to keep looking at the declarations.  You
> can do that by just looking them up (lookup_fnfields_slot) and iterating
> over them, you don't need to call synthesized_method_walk.

You mean using trivially_xible might check assignability or copy
constructibility from const T& but not from T& (or the other way
around), and you think both (or perhaps even other forms) should
be considered?

E.g., given:

   struct S
   {
     S& operator= (const S&) = default;
     void operator= (S&) = delete;
   };

   void f (S *d, const S *s)
   {
     memcpy(d, s, sizeof *d);   // don't warn here
   }

   void g (S *d, S *s)
   {
     memcpy(d, s, sizeof *d);   // but warn here
   }

And your suggestion is to iterate over the assignment operator
(and copy ctor) overloads for S looking for one that's trivial,
public, and not deleted?

If that's it, I was thinking of just checking for the const T&
overload (as if by using std::is_trivially_copy_assignable<T>()).

I don't mind trying the approach you suggest.  It should be more
accurate.  I just want to make sure we're on the same page.

Martin



More information about the Gcc-patches mailing list