From b2504bdc0d0eb0aaf1500da08a176bd44c2ae5d0 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Mon, 4 Nov 2013 04:26:14 +0000 Subject: Issue a diagnostic if an implicitly-defined move assignment operator would move the same virtual base class multiple times (and the move assignment is used, and the move assignment for the virtual base is not trivial). llvm-svn: 193977 --- .../test/CXX/special/class.copy/implicit-move.cpp | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'clang/test/CXX/special/class.copy/implicit-move.cpp') diff --git a/clang/test/CXX/special/class.copy/implicit-move.cpp b/clang/test/CXX/special/class.copy/implicit-move.cpp index 5c3a6027cda..23ecf2e7d95 100644 --- a/clang/test/CXX/special/class.copy/implicit-move.cpp +++ b/clang/test/CXX/special/class.copy/implicit-move.cpp @@ -243,6 +243,61 @@ namespace DR1402 { (void)CopyAndMove(cm); // expected-error {{deleted}} cm = cm; // expected-error {{deleted}} } + + namespace VbaseMove { + struct A {}; + struct B { B &operator=(B&&); }; + struct C { C &operator=(const C&); }; + struct D { B b; }; + + template + struct E : virtual T {}; + + template + struct E : virtual T { E &operator=(E&&); }; + + template + struct F : + E, // expected-note-re 2{{'[BD]' is a virtual base class of base class 'E<}} + E {}; // expected-note-re 2{{'[BD]' is a virtual base class of base class 'E<}} + + template + struct G : E, E {}; + + template + struct H : E, E {}; + + template + struct I : E, T {}; + + template + struct J : + E, // expected-note-re 2{{'[BD]' is a virtual base class of base class 'E<}} + virtual T {}; // expected-note-re 2{{virtual base class '[BD]' declared here}} + + template void move(T t) { t = static_cast(t); } + // expected-warning-re@-1 4{{defaulted move assignment operator of .* will move assign virtual base class '[BD]' multiple times}} + template void move(F); + template void move(F); // expected-note {{in instantiation of}} + template void move(F); + template void move(F); // expected-note {{in instantiation of}} + template void move(G); + template void move(G); + template void move(G); + template void move(G); + template void move(H); + template void move(H); + template void move(H); + template void move(H); + template void move(I); + template void move(I); + template void move(I); + template void move(I); + template void move(J); + template void move(J); // expected-note {{in instantiation of}} + template void move(J); + template void move(J); // expected-note {{in instantiation of}} + } } namespace PR12625 { -- cgit v1.2.3