73 lines · c
1 2// NOTE: source_location.cpp must include this file after defining3// std::source_location.4namespace source_location_file {5 6constexpr const char *FILE = __FILE__;7constexpr const char *FILE_NAME = __FILE_NAME__;8 9constexpr SL global_info = SL::current();10constexpr const char *global_info_filename = __builtin_FILE_NAME();11 12constexpr SL test_function(SL v = SL::current()) {13 return v;14}15 16constexpr SL test_function_indirect() {17 return test_function();18}19 20constexpr const char *test_function_filename(21 const char *file_name = __builtin_FILE_NAME()) {22 return file_name;23}24 25constexpr const char *test_function_filename_indirect() {26 return test_function_filename();27}28 29template <class T, class U = SL>30constexpr U test_function_template(T, U u = U::current()) {31 return u;32}33 34template <class T, class U = SL>35constexpr U test_function_template_indirect(T t) {36 return test_function_template(t);37}38 39template <class T, class U = const char *>40constexpr U test_function_filename_template(T, U u = __builtin_FILE_NAME()) {41 return u;42}43 44template <class T, class U = const char *>45constexpr U test_function_filename_template_indirect(T t) {46 return test_function_filename_template(t);47}48 49struct 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()) :57 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()) :61 ctor_info(u), ctor_info_file_name(cfile_name) {}62};63 64template <class T = SL>65struct 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_file73