1*67e74705SXin Li // RUN: %clang_cc1 %s -fno-rtti -emit-llvm-only -o - -triple=i386-pc-win32 -verify 2*67e74705SXin Li 3*67e74705SXin Li // A is not trivially copyable and must be passed indirectly or with inalloca. 4*67e74705SXin Li struct A { 5*67e74705SXin Li A(); 6*67e74705SXin Li A(const A &o); 7*67e74705SXin Li virtual ~A(); 8*67e74705SXin Li int a; 9*67e74705SXin Li }; 10*67e74705SXin Li 11*67e74705SXin Li struct B { 12*67e74705SXin Li B(); 13*67e74705SXin Li int b; 14*67e74705SXin Li virtual B *clone(A); 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li // Converting from C* to B* requires a this adjustment. 18*67e74705SXin Li struct C : A, B { 19*67e74705SXin Li C(); 20*67e74705SXin Li int c; 21*67e74705SXin Li virtual C *clone(A); // expected-error {{cannot compile this non-trivial argument copy for return-adjusting thunk yet}} 22*67e74705SXin Li }; B()23*67e74705SXin LiB::B() {} // force emission C()24*67e74705SXin LiC::C() {} // force emission 25