As it was discovered in post-commit feedback
for 0aa0458f14,
we handle thunks incorrectly, and end up annotating
their this/return with attributes that are valid
for their callees, not for thunks themselves.
While it would be good to fix this properly,
and keep annotating them on thunks,
i've tried doing that in https://reviews.llvm.org/D100388
with little success, and the patch is stuck for a month now.
So for now, as a stopgap measure, subj.
30 lines
1.1 KiB
C++
30 lines
1.1 KiB
C++
// RUN: %clang_cc1 -fexceptions -fcxx-exceptions %s -triple=x86_64-pc-linux-gnu -munwind-tables -emit-llvm -o - -O1 -disable-llvm-passes | FileCheck %s
|
|
|
|
// When generating the thunk for secondary, do not push terminate scopes for
|
|
// either the varargs or non-varargs case. Related to PR44987.
|
|
|
|
struct A {
|
|
virtual void primary_key();
|
|
};
|
|
struct B {
|
|
virtual void secondary();
|
|
virtual void secondary_vararg(int, ...);
|
|
};
|
|
class C : A, B {
|
|
virtual void primary_key();
|
|
void secondary() noexcept;
|
|
void secondary_vararg(int, ...) noexcept;
|
|
};
|
|
void C::primary_key() {}
|
|
|
|
// CHECK-LABEL: define available_externally void @_ZThn8_N1C9secondaryEv(%class.C* %this) {{.*}} #2
|
|
// CHECK-NOT: invoke
|
|
// CHECK: tail call void @_ZN1C9secondaryEv(%class.C* {{[^,]*}} %{{.*}})
|
|
// CHECK-NOT: invoke
|
|
// CHECK: ret void
|
|
|
|
// CHECK-LABEL: define available_externally void @_ZThn8_N1C16secondary_varargEiz(%class.C* %this, i32 %0, ...) {{.*}} #2
|
|
// CHECK-NOT: invoke
|
|
// CHECK: musttail call void (%class.C*, i32, ...) @_ZN1C16secondary_varargEiz(%class.C* {{[^,]*}} %{{.*}}, i32 %{{.*}}, ...) #3
|
|
// CHECK-NEXT: ret void
|