// NOTE: source_location.cpp must include this file after defining // std::source_location. namespace source_location_file { constexpr const char *FILE = __FILE__; constexpr const char *FILE_NAME = __FILE_NAME__; constexpr SL global_info = SL::current(); constexpr const char *global_info_filename = __builtin_FILE_NAME(); constexpr SL test_function(SL v = SL::current()) { return v; } constexpr SL test_function_indirect() { return test_function(); } constexpr const char *test_function_filename( const char *file_name = __builtin_FILE_NAME()) { return file_name; } constexpr const char *test_function_filename_indirect() { return test_function_filename(); } template constexpr U test_function_template(T, U u = U::current()) { return u; } template constexpr U test_function_template_indirect(T t) { return test_function_template(t); } template constexpr U test_function_filename_template(T, U u = __builtin_FILE_NAME()) { return u; } template constexpr U test_function_filename_template_indirect(T t) { return test_function_filename_template(t); } struct TestClass { SL info = SL::current(); const char *info_file_name = __builtin_FILE_NAME(); SL ctor_info; const char *ctor_info_file_name = nullptr; TestClass() = default; constexpr TestClass(int, SL cinfo = SL::current(), const char *cfile_name = __builtin_FILE_NAME()) : ctor_info(cinfo), ctor_info_file_name(cfile_name) {} template constexpr TestClass(int, T, U u = U::current(), const char *cfile_name = __builtin_FILE_NAME()) : ctor_info(u), ctor_info_file_name(cfile_name) {} }; template struct AggrClass { int x; T info; T init_info = T::current(); const char *init_info_file_name = __builtin_FILE_NAME(); }; } // namespace source_location_file