mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 19:06:33 +00:00
[clang][ItaniumMangle] Mangle friend function templates with a constr… (#110247)
…aint that depends on a template parameter from an enclosing template as members of the enclosing class. Such function templates should be considered member-like constrained friends per [temp.friend]p9 and https://github.com/itanium-cxx-abi/cxx-abi/issues/24#issuecomment-934977198).
This commit is contained in:
parent
0d384fe978
commit
147558e31c
@ -447,6 +447,7 @@ Bug Fixes to C++ Support
|
||||
- Fixed an assertion failure in debug mode, and potential crashes in release mode, when
|
||||
diagnosing a failed cast caused indirectly by a failed implicit conversion to the type of the constructor parameter.
|
||||
- Fixed an assertion failure by adjusting integral to boolean vector conversions (#GH108326)
|
||||
- Mangle friend function templates with a constraint that depends on a template parameter from an enclosing template as members of the enclosing class. (#GH110247)
|
||||
|
||||
Bug Fixes to AST Handling
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -693,7 +693,7 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const Decl *D) {
|
||||
if (VD->isExternC())
|
||||
return getASTContext().getTranslationUnitDecl();
|
||||
|
||||
if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
|
||||
if (const auto *FD = D->getAsFunction()) {
|
||||
if (FD->isExternC())
|
||||
return getASTContext().getTranslationUnitDecl();
|
||||
// Member-like constrained friends are mangled as if they were members of
|
||||
|
@ -52,30 +52,53 @@ namespace test2 {
|
||||
};
|
||||
|
||||
A<int> ai;
|
||||
A<bool> aj;
|
||||
|
||||
// CHECK-LABEL: define {{.*}}@{{.*}}test2{{.*}}use
|
||||
void use() {
|
||||
// CHECK: call {{.*}}@_ZN5test21AIiEF1fEzQ4TrueIT_E(
|
||||
// CLANG17: call {{.*}}@_ZN5test21fEz(
|
||||
f(ai);
|
||||
// CHECK: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
|
||||
// CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
|
||||
// CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
|
||||
g(ai);
|
||||
// CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
|
||||
// CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
|
||||
h(ai);
|
||||
// CHECK: call {{.*}}@_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
|
||||
// CHECK: call {{.*}}@_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
|
||||
i(ai);
|
||||
// CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
|
||||
j(ai);
|
||||
// CHECK: call {{.*}}@_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz(
|
||||
// CHECK: call {{.*}}@_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
|
||||
k(ai);
|
||||
// CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21lIvEEvz(
|
||||
l(ai);
|
||||
|
||||
// CHECK: call {{.*}}@_ZN5test21AIbEF1fEzQ4TrueIT_E(
|
||||
// CLANG17: call {{.*}}@_ZN5test21fEz(
|
||||
f(aj);
|
||||
// CHECK: call {{.*}}@_ZN5test21AIbEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
|
||||
// CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
|
||||
g(aj);
|
||||
// CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
|
||||
// CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
|
||||
h(aj);
|
||||
// CHECK: call {{.*}}@_ZN5test21AIbEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
|
||||
i(aj);
|
||||
// CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
|
||||
j(aj);
|
||||
// CHECK: call {{.*}}@_ZN5test21AIbEF1kITk4TruevQ4TrueIT_EEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
|
||||
k(aj);
|
||||
// CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
|
||||
// CLANG17: call {{.*}}@_ZN5test21lIvEEvz(
|
||||
l(aj);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -30128,11 +30128,15 @@ const char* cases[][2] =
|
||||
// C++20 concepts, see https://github.com/itanium-cxx-abi/cxx-abi/issues/24.
|
||||
{"_Z2f0IiE1SIX1CIT_EEEv", "S<C<int>> f0<int>()"},
|
||||
{"_ZN5test21AIiEF1fEzQ4TrueIT_E", "test2::A<int>::friend f(...) requires True<T>"},
|
||||
{"_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::friend g<void>(...) requires True<T> && True<TL0_>"},
|
||||
{"_ZN5test21AIbEF1fEzQ4TrueIT_E", "test2::A<bool>::friend f(...) requires True<T>"},
|
||||
{"_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::A<int>::friend g<void>(...) requires True<T> && True<TL0_>"},
|
||||
{"_ZN5test21AIbEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::A<bool>::friend g<void>(...) requires True<T> && True<TL0_>"},
|
||||
{"_ZN5test21hIvEEvzQ4TrueITL0__E", "void test2::h<void>(...) requires True<TL0_>"},
|
||||
{"_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::friend i<void>(...)"},
|
||||
{"_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::A<int>::friend i<void>(...)"},
|
||||
{"_ZN5test21AIbEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::A<bool>::friend i<void>(...)"},
|
||||
{"_ZN5test21jIvQ4TrueITL0__EEEvz", "void test2::j<void>(...)"},
|
||||
{"_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz", "void test2::friend k<void>(...)"},
|
||||
{"_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz", "void test2::A<int>::friend k<void>(...)"},
|
||||
{"_ZN5test21AIbEF1kITk4TruevQ4TrueIT_EEEvz", "void test2::A<bool>::friend k<void>(...)"},
|
||||
{"_ZN5test21lITk4TruevEEvz", "void test2::l<void>(...)"},
|
||||
{"_ZN5test31dITnDaLi0EEEvv", "void test3::d<0>()"},
|
||||
{"_ZN5test31eITnDcLi0EEEvv", "void test3::e<0>()"},
|
||||
|
Loading…
x
Reference in New Issue
Block a user