diff --git a/clang/test/CodeGenCXX/thunk-wrong-return-type.cpp b/clang/test/CodeGenCXX/thunk-wrong-return-type.cpp new file mode 100644 index 0000000000000..f6d662c8cb7a9 --- /dev/null +++ b/clang/test/CodeGenCXX/thunk-wrong-return-type.cpp @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 -emit-llvm-only -triple %itanium_abi_triple %s -emit-llvm -o - %s | FileCheck %s + +struct A {}; +struct alignas(32) B : virtual A { + char c[32]; +}; +struct Pad { + char c[7]; +}; +struct C : B, Pad, virtual A {}; + +struct X { + virtual A &f(); +}; +struct U { + virtual ~U(); +}; +C c; +struct Y : U, X { + virtual B &f() override { return c; } +}; + +Y y; + +// FIXME: The return type should be align 1 dereferenceable(1) %struct.A.8* +// CHECK: define linkonce_odr nonnull align 32 dereferenceable(40) %struct.B.1* @_ZTchn8_v0_n24_N1Y1fEv(%struct.Y.5* nonnull dereferenceable(16) %this) unnamed_addr #1 comdat align 2 { diff --git a/clang/test/CodeGenCXX/thunk-wrong-this.cpp b/clang/test/CodeGenCXX/thunk-wrong-this.cpp new file mode 100644 index 0000000000000..664163a3b9da5 --- /dev/null +++ b/clang/test/CodeGenCXX/thunk-wrong-this.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -emit-llvm-only -triple %itanium_abi_triple %s -emit-llvm -o - %s | FileCheck %s + +class Base1 { + virtual void Foo1(); +}; + +class Base2 { + virtual void Foo2(); +}; + +class alignas(16) Obj : public Base1, public Base2 { + void Foo1() override; + void Foo2() override; + ~Obj(); +}; + +void Obj::Foo1() {} +void Obj::Foo2() {} + +// CHECK: define dso_local void @_ZN3Obj4Foo2Ev(%class.Obj.0* nonnull dereferenceable(16) %this) unnamed_addr #0 align 2 { + +// FIXME: the argument should be %class.Base2.2* nonnull dereferenceable(8) %this +// CHECK: define dso_local void @_ZThn8_N3Obj4Foo2Ev(%class.Obj.0* nonnull dereferenceable(16) %this) unnamed_addr #1 align 2 { + +// CHECK: tail call void @_ZN3Obj4Foo2Ev(%class.Obj.0* nonnull dereferenceable(16) %2)