annotate gcc/testsuite/g++.dg/cpp2a/srcloc1.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // { dg-do compile { target c++2a } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 namespace std {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 struct source_location {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 struct __impl {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 const char *_M_file_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 const char *_M_function_name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 unsigned int _M_line, _M_column;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 const __impl *__ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 constexpr source_location () : __ptr (nullptr) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 static consteval source_location
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 current (const void *__p = __builtin_source_location ()) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 source_location __ret;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 __ret.__ptr = static_cast <const __impl *> (__p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 return __ret;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 constexpr const char *file_name () const {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 return __ptr ? __ptr->_M_file_name : "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 constexpr const char *function_name () const {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 return __ptr ? __ptr->_M_function_name : "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 constexpr unsigned line () const {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 return __ptr ? __ptr->_M_line : 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 constexpr unsigned column () const {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 return __ptr ? __ptr->_M_column : 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 using namespace std;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 consteval source_location
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 bar (const source_location x = source_location::current ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 return x;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 foo (const char **p, unsigned *q)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 constexpr source_location s = source_location::current ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 constexpr source_location t = bar ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 p[0] = s.file_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 p[1] = s.function_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 q[0] = s.line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 q[1] = s.column ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 p[2] = t.file_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 p[3] = t.function_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 q[2] = t.line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 q[3] = t.column ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 constexpr const char *r = s.file_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 source_location s3 = source_location::current ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 template <int N>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 constexpr source_location
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 baz ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 return source_location::current ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 #define A \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 source_location s[3] = { source_location::current (), \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 source_location::current (), \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 source_location::current () }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 source_location *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 boo ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 static A;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 return &s[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 constexpr source_location s1 = baz <0> ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 constexpr source_location s2 = baz <1> ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 const source_location *p1 = &s1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 const source_location *p2 = &s2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 static_assert (source_location::current ().line () == __LINE__);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 static_assert (source_location::current ().column () == 42);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 constexpr bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 quux ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 const char *file1 = source_location::current ().file_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 const char *file2 = __FILE__;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 const char *function1 = source_location::current ().function_name ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 const char *function2 = __FUNCTION__;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 int line1 = source_location::current ().line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 int line2 = __LINE__ - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 int column
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 = source_location::current ().column ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 int i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 for (; file1[i]; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 if (file1[i] != file2[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 if (file2[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 for (i = 0; function1[i]; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 if (function1[i] != function2[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 if (function2[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 if (line1 != line2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 if (column != 33)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 static_assert (quux ());