// { dg-do run { target c++20 } } namespace std { struct source_location { struct __impl { const char *_M_file_name; const char *_M_function_name; unsigned int _M_line, _M_column; }; const __impl *__ptr; constexpr source_location () : __ptr (nullptr) {} static consteval source_location current (const void *__p = __builtin_source_location ()) { source_location __ret; __ret.__ptr = static_cast (__p); return __ret; } constexpr const char *file_name () const { return __ptr ? __ptr->_M_file_name : ""; } constexpr const char *function_name () const { return __ptr ? __ptr->_M_function_name : ""; } constexpr unsigned line () const { return __ptr ? __ptr->_M_line : 0; } constexpr unsigned column () const { return __ptr ? __ptr->_M_column : 0; } }; } using namespace std; struct S { source_location a = source_location::current (); source_location b = source_location::current (); source_location c = source_location (); constexpr S () { c = source_location::current (); } }; struct T { int t; source_location u = source_location::current (); int v = __builtin_LINE (); }; constexpr S s; constexpr T t = { 1 }; constexpr bool cmp (const char *p, const char *q) { for (; *p && *q; p++, q++) if (*p != *q) return true; return *p || *q; } constexpr bool foo () { T u = { 2 }; source_location v = source_location::current (); if (cmp (s.a.file_name (), s.c.file_name ()) || cmp (s.b.file_name (), s.c.file_name ()) || cmp (t.u.file_name (), s.c.file_name ()) || cmp (u.u.file_name (), s.c.file_name ()) || cmp (v.file_name (), s.c.file_name ()) || cmp (s.a.function_name (), s.c.function_name ()) || cmp (s.b.function_name (), s.c.function_name ()) || cmp (t.u.function_name (), "") || cmp (u.u.function_name (), v.function_name ()) || s.a.line () != s.c.line () || s.b.line () != s.c.line () || t.u.line () != t.v || u.u.line () + 1 != v.line () || s.a.column () != 18 || s.b.column () != 18 || s.c.column () != 49 || t.u.column () != 21 || u.u.column () != 13 || v.column () != 48) return false; return true; } static_assert (foo ()); int main () { if (!foo ()) __builtin_abort (); }