http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57319
Bug ID: 57319 Summary: [4.8/4.9] Regression: bogus "defaulted move assignment for ... calls a non-trivial move assignment operator for virtual base ..." Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ppluzhnikov at google dot com Google reference: b/9004260 Test case: class A { }; class B: virtual A { }; class C: virtual B { }; class D: C { void operator= (D &); }; Using current trunk (@r199023): g++ -c t.ii -std=c++11 t.ii:3:7: warning: defaulted move assignment for ‘C’ calls a non-trivial move assignment operator for virtual base ‘B’ [-Wvirtual-move-assign] class C: virtual B { }; ^ Richard Smith writes: The problem is that a defaulted move assignment for a class with two inheritance paths to a virtual base may move-assign that virtual base multiple times (and thus may lose state). However, this particular case *isn't* the problematic case, because (a) this sample code should not trigger the definition of C's move assignment operator, and (b) there is only one inheritance path from C to B, so it won't be move-assigned multiple times, and (c) the issue isn't with *non-trivial* move assignments, it's with *user-provided* move-assignments (for the virtual base or any of its subobjects), which B does not have. => This is a false positive.