
When we create a lambda, we would skip over declaration contexts representing a require expression body, which would lead to wrong lookup. Note that I wasn't able to establish why the code in `Sema::createLambdaClosureType` was there to begin with (it's not exactly recent) The changes to mangling only ensure the status quo is preserved and do not attempt to address the known issues of mangling lambdas in require clauses. In particular the itanium mangling is consistent with Clang before this patch but differs from GCC's. Fixes #147650
72 lines
1.6 KiB
C++
72 lines
1.6 KiB
C++
// RUN: %clang_cc1 -std=c++20 -triple=x86_64-windows-msvc -Wno-defaulted-function-deleted -fms-compatibility -fms-extensions -emit-llvm %s -o - | FileCheck %s
|
|
|
|
namespace CWG2369 {
|
|
|
|
namespace Regression1 {
|
|
|
|
template <class, class Up>
|
|
using compare_three_way_result_t = Up::type;
|
|
|
|
struct sfinae_assign_base {};
|
|
|
|
template <class Tp>
|
|
concept is_derived_from_optional =
|
|
requires(Tp param) { []<class Up>(Up) {}(param); };
|
|
|
|
template <class Tp, class Up>
|
|
requires(is_derived_from_optional<Up> && []<class W>(W) { return true; }(Up()))
|
|
compare_three_way_result_t<Tp, Up> operator<=>(Tp, Up);
|
|
|
|
struct RuntimeModeArgs {
|
|
auto operator<=>(const RuntimeModeArgs &) const = default;
|
|
sfinae_assign_base needs_admin;
|
|
};
|
|
|
|
RuntimeModeArgs foo() {
|
|
return {};
|
|
}
|
|
|
|
// CHECK: ?foo@Regression1@CWG2369@@YA?AURuntimeModeArgs@12@XZ
|
|
|
|
} // namespace Regression1
|
|
|
|
namespace Regression2 {
|
|
|
|
template <class _Tp>
|
|
constexpr _Tp * __to_address(_Tp *) {
|
|
return nullptr;
|
|
}
|
|
|
|
template <class _Ip>
|
|
concept contiguous_iterator = requires(_Ip __i) { __to_address(__i); };
|
|
|
|
struct basic_string_view {
|
|
template <contiguous_iterator _It>
|
|
basic_string_view(_It, _It);
|
|
};
|
|
|
|
const char *str;
|
|
void sv() { basic_string_view(str, str); }
|
|
|
|
void m_fn2() {
|
|
const char __trans_tmp_1 = *__to_address(&__trans_tmp_1);
|
|
}
|
|
|
|
// CHECK: define {{.*}} @"??$__to_address@$$CBD@Regression2@CWG2369@@YAPEBDPEBD@Z"
|
|
|
|
} // namespace Regression2
|
|
|
|
}
|
|
|
|
namespace GH147650 {
|
|
|
|
template <int> int b;
|
|
template <int b>
|
|
void f()
|
|
requires requires { [] { (void)b; }; } {}
|
|
void test() {
|
|
f<42>();
|
|
}
|
|
// CHECK-LABEL:define {{.*}} void @"??$f@$0CK@@GH147650@@YAXXZ"()
|
|
}
|