1 // { dg-do compile { target c++20 } }
4 inline namespace _8 { }
6 struct source_location {
8 const char *_M_file_name;
9 const char *_M_function_name;
10 unsigned int _M_line, _M_column;
13 constexpr source_location () : __ptr (nullptr) {}
14 static consteval source_location
15 current (const void *__p = __builtin_source_location ()) {
16 source_location __ret;
17 __ret.__ptr = static_cast <const __impl *> (__p);
20 constexpr const char *file_name () const {
21 return __ptr ? __ptr->_M_file_name : "";
23 constexpr const char *function_name () const {
24 return __ptr ? __ptr->_M_function_name : "";
26 constexpr unsigned line () const {
27 return __ptr ? __ptr->_M_line : 0;
29 constexpr unsigned column () const {
30 return __ptr ? __ptr->_M_column : 0;
38 consteval source_location
39 bar (const source_location x = source_location::current ())
45 foo (const char **p, unsigned *q)
47 constexpr source_location s = source_location::current ();
48 constexpr source_location t = bar ();
49 p[0] = s.file_name ();
50 p[1] = s.function_name ();
53 p[2] = t.file_name ();
54 p[3] = t.function_name ();
57 constexpr const char *r = s.file_name ();
60 source_location s3 = source_location::current ();
63 constexpr source_location
66 return source_location::current ();
70 source_location s[3] = { source_location::current (), \
71 source_location::current (), \
72 source_location::current () }
81 constexpr source_location s1 = baz <0> ();
82 constexpr source_location s2 = baz <1> ();
83 const source_location *p1 = &s1;
84 const source_location *p2 = &s2;
86 static_assert (source_location::current ().line () == __LINE__);
87 static_assert (source_location::current ().column () == 41);
92 const char *file1 = source_location::current ().file_name ();
93 const char *file2 = __FILE__;
94 const char *function1 = source_location::current ().function_name ();
95 const char *function2 = __PRETTY_FUNCTION__;
96 int line1 = source_location::current ().line ();
97 int line2 = __LINE__ - 1;
99 = source_location::current ().column ();
101 for (; file1[i]; i++)
102 if (file1[i] != file2[i])
106 for (i = 0; function1[i]; i++)
107 if (function1[i] != function2[i])
118 static_assert (quux ());