[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