| // RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s | |
| struct ThisShouldBeCalled { | |
| ThisShouldBeCalled() {} | |
| }; | |
| template <typename T> | |
| struct ThisShouldBeCalledTPL { | |
| ThisShouldBeCalledTPL() {} | |
| }; | |
| consteval int f () { | |
| return 42; | |
| } | |
| struct WithConsteval { | |
| WithConsteval(int x = f()) {} | |
| }; | |
| template <typename T> | |
| struct WithConstevalTPL { | |
| WithConstevalTPL(T x = f()) {} | |
| }; | |
| struct Base { | |
| ThisShouldBeCalled y = {}; | |
| }; | |
| struct S : Base { | |
| ThisShouldBeCalledTPL<int> A = {}; | |
| WithConsteval B = {}; | |
| WithConstevalTPL<double> C = {}; | |
| }; | |
| void Do(S = S{}) {} | |
| void test() { | |
| Do(); | |
| } | |
| // CHECK-LABEL: @_ZN18ThisShouldBeCalledC2Ev | |
| // CHECK-LABEL: @_ZN21ThisShouldBeCalledTPLIiEC2Ev | |
| // CHECK-LABEL: @_ZN13WithConstevalC2Ei | |
| // CHECK-LABEL: @_ZN16WithConstevalTPLIdEC2Ed | |
| namespace check_arrays { | |
| template <typename T> | |
| struct inner { | |
| inner() {} | |
| }; | |
| struct S { | |
| inner<int> a {}; | |
| }; | |
| class C { | |
| S s[1]{}; | |
| }; | |
| int f() { | |
| C c; | |
| return 0; | |
| } | |
| // CHECK-LABEL: @_ZN12check_arrays5innerIiEC2Ev | |
| } | |
| namespace check_field_inits_in_base_constructors { | |
| template <typename> | |
| struct ShouldBeODRUsed { | |
| ShouldBeODRUsed() {} | |
| }; | |
| class k { | |
| // The private here is important, | |
| // otherwise it would be aggregate initialized. | |
| private: | |
| ShouldBeODRUsed<k> a = {}; | |
| }; | |
| struct b { | |
| k c{}; | |
| }; | |
| void test() { b d; } | |
| // CHECK-LABEL: @_ZN38check_field_inits_in_base_constructors15ShouldBeODRUsedINS_1kEEC2Ev | |
| } | |
| namespace check_referenced_when_defined_in_default_parameter { | |
| template <typename T> | |
| struct Test { | |
| Test(auto&&) {} | |
| }; | |
| struct Options { | |
| Test<bool(bool x)> identity = [](bool x) -> bool { return x; }; | |
| }; | |
| struct Wrapper { | |
| Wrapper(const Options& options = Options()); | |
| }; | |
| void Func() { Options options; } | |
| // CHECK-LABEL: @_ZN50check_referenced_when_defined_in_default_parameter7OptionsC2Ev | |
| // CHECK-LABEL: @_ZN50check_referenced_when_defined_in_default_parameter4TestIFbbEEC1INS_7Options8identityMUlbE_EEEOT_ | |
| // CHECK-LABEL: @_ZN50check_referenced_when_defined_in_default_parameter4TestIFbbEEC2INS_7Options8identityMUlbE_EEEOT_ | |
| } | |
| namespace lambda_body { | |
| template <typename a> | |
| int templated_func() { | |
| return 0; | |
| } | |
| struct test_body { | |
| int mem = templated_func<int>(); | |
| }; | |
| struct test_capture { | |
| int mem = templated_func<double>(); | |
| }; | |
| struct S { | |
| int a = [_ = test_capture{}] { (void)test_body{}; return 0;}(); | |
| }; | |
| void test() { | |
| S s; | |
| } | |
| // CHECK-LABEL: define{{.*}} @_ZN11lambda_body14templated_funcIdEEiv | |
| // CHECK-LABEL: define{{.*}} @_ZNK11lambda_body1S1aMUlvE_clEv | |
| // CHECK-LABEL: define{{.*}} @_ZN11lambda_body14templated_funcIiEEiv | |
| } |