1
2 // NOTE: source_location.cpp must include this file after defining
3 // std::source_location.
4 namespace source_location_file {
5
6 constexpr const char *FILE = __FILE__;
7 constexpr const char *FILE_NAME = __FILE_NAME__;
8
9 constexpr SL global_info = SL::current();
10 constexpr const char *global_info_filename = __builtin_FILE_NAME();
11
12 constexpr SL test_function(SL v = SL::current()) {
13 return v;
14 }
15
test_function_indirect()16 constexpr SL test_function_indirect() {
17 return test_function();
18 }
19
20 constexpr const char *test_function_filename(
21 const char *file_name = __builtin_FILE_NAME()) {
22 return file_name;
23 }
24
test_function_filename_indirect()25 constexpr const char *test_function_filename_indirect() {
26 return test_function_filename();
27 }
28
29 template <class T, class U = SL>
30 constexpr U test_function_template(T, U u = U::current()) {
31 return u;
32 }
33
34 template <class T, class U = SL>
test_function_template_indirect(T t)35 constexpr U test_function_template_indirect(T t) {
36 return test_function_template(t);
37 }
38
39 template <class T, class U = const char *>
40 constexpr U test_function_filename_template(T, U u = __builtin_FILE_NAME()) {
41 return u;
42 }
43
44 template <class T, class U = const char *>
test_function_filename_template_indirect(T t)45 constexpr U test_function_filename_template_indirect(T t) {
46 return test_function_filename_template(t);
47 }
48
49 struct TestClass {
50 SL info = SL::current();
51 const char *info_file_name = __builtin_FILE_NAME();
52 SL ctor_info;
53 const char *ctor_info_file_name = nullptr;
54 TestClass() = default;
55 constexpr TestClass(int, SL cinfo = SL::current(),
56 const char *cfile_name = __builtin_FILE_NAME()) :
ctor_infoTestClass57 ctor_info(cinfo), ctor_info_file_name(cfile_name) {}
58 template <class T, class U = SL>
59 constexpr TestClass(int, T, U u = U::current(),
60 const char *cfile_name = __builtin_FILE_NAME()) :
ctor_infoTestClass61 ctor_info(u), ctor_info_file_name(cfile_name) {}
62 };
63
64 template <class T = SL>
65 struct AggrClass {
66 int x;
67 T info;
68 T init_info = T::current();
69 const char *init_info_file_name = __builtin_FILE_NAME();
70 };
71
72 } // namespace source_location_file
73