annotate gcc/testsuite/g++.dg/cpp1z/constexpr-84684.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 // PR c++/84684
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 // { dg-do compile { target c++17 } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 typedef decltype (sizeof (0)) size_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 namespace std {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 template<class _E>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 struct initializer_list
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 typedef _E value_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 typedef const _E& reference;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 typedef const _E& const_reference;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 typedef size_t size_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 typedef const _E* iterator;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 typedef const _E* const_iterator;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 iterator _M_array;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 size_type _M_len;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 constexpr initializer_list(const_iterator __a, size_type __l) : _M_array(__a), _M_len(__l) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 constexpr initializer_list() noexcept : _M_array(0), _M_len(0) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 constexpr size_type size() const noexcept { return _M_len; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 constexpr const_iterator begin() const noexcept { return _M_array; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 constexpr const_iterator end() const noexcept { return begin() + size(); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 template <typename E, size_t N>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 struct array
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 constexpr E &operator[](size_t n) noexcept { return elems[n]; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 constexpr const E &operator[](size_t n) const noexcept { return elems[n]; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 constexpr size_t size() const { return N; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 E elems[N];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 template<typename T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 constexpr
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 inline T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 max (std::initializer_list<T> i)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 const T *b = i.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 const T *e = i.end ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 if (b == e) return *b;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 const T *r = b;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 while (++b != e)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 if (*r < *b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 r = b;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 return *r;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 template <typename alphabet_type>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 constexpr char to_char(alphabet_type const alph)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 return alph.to_char();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 template <typename ...alphabet_types>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 struct union_composition
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 static constexpr size_t value_size = (alphabet_types::value_size + ... );
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 unsigned char _value;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 template <size_t fixed_size, typename alphabet_t>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 static constexpr auto value_to_char_helper(alphabet_t alphabet)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 array<char, fixed_size> value_to_char{};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 for (size_t i = 0u; i < alphabet_t::value_size; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 value_to_char[i] = to_char(alphabet.assign_rank(i));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 return value_to_char;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 static constexpr auto make_value_to_char()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 constexpr auto N = sizeof...(alphabet_types);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 constexpr array<size_t, N> alphabet_sizes { alphabet_types::value_size... };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 constexpr size_t fixed_size = max({alphabet_types::value_size...});
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 array value_to_char_tables = array<array<char, fixed_size>, N> {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 value_to_char_helper<fixed_size>(alphabet_types{})...
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 array<char, value_size> value_to_char{};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 for (size_t i = 0u, value = 0u; i < N; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 for (size_t k = 0u; k < alphabet_sizes[i]; ++k, ++value)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 value_to_char[value] = value_to_char_tables[i][k];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 return value_to_char;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 struct gap
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 constexpr char to_char() const noexcept { return '-'; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 constexpr gap & assign_rank([[maybe_unused]] bool const i) noexcept { return *this; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 static constexpr size_t value_size{1};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 struct dna4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 constexpr char to_char() const noexcept { return value_to_char[_value]; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 constexpr dna4 & assign_rank(unsigned char const c) { _value = c; return *this; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 static constexpr size_t value_size{4};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 static constexpr char value_to_char[value_size] { 'A', 'C', 'G', 'T' };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 unsigned char _value;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 struct dna5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 constexpr char to_char() const noexcept { return value_to_char[_value]; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 constexpr dna5 & assign_rank(unsigned char const c) { _value = c; return *this; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 static constexpr size_t value_size{5};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 static constexpr char value_to_char[value_size] { 'A', 'C', 'G', 'T', 'N' };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 unsigned char _value;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 constexpr array value_to_char1 = union_composition<dna4>::make_value_to_char();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 static_assert(value_to_char1.size() == 4u);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 static_assert(value_to_char1[0] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 static_assert(value_to_char1[1] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 static_assert(value_to_char1[2] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 static_assert(value_to_char1[3] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 constexpr array value_to_char2 = union_composition<dna4, gap>::make_value_to_char();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 static_assert(value_to_char2.size() == 5u);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 static_assert(value_to_char2[0] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 static_assert(value_to_char2[1] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 static_assert(value_to_char2[2] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 static_assert(value_to_char2[3] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 static_assert(value_to_char2[4] == '-');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 constexpr array value_to_char3 = union_composition<dna4, gap, dna5>::make_value_to_char();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 static_assert(value_to_char3.size() == 10u);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 static_assert(value_to_char3[0] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 static_assert(value_to_char3[1] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 static_assert(value_to_char3[2] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 static_assert(value_to_char3[3] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 static_assert(value_to_char3[4] == '-');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 static_assert(value_to_char3[5] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 static_assert(value_to_char3[6] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 static_assert(value_to_char3[7] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 static_assert(value_to_char3[8] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 static_assert(value_to_char3[9] == 'N');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 constexpr array value_to_char4 = union_composition<dna5, gap, dna4>::make_value_to_char();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 static_assert(value_to_char4.size() == 10u);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 static_assert(value_to_char4[0] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 static_assert(value_to_char4[1] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 static_assert(value_to_char4[2] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 static_assert(value_to_char4[3] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 static_assert(value_to_char4[4] == 'N');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 static_assert(value_to_char4[5] == '-');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 static_assert(value_to_char4[6] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 static_assert(value_to_char4[7] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 static_assert(value_to_char4[8] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 static_assert(value_to_char4[9] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 constexpr array value_to_char5 = union_composition<gap, dna4, dna5>::make_value_to_char();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 static_assert(value_to_char5.size() == 10u);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 static_assert(value_to_char5[0] == '-');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 static_assert(value_to_char5[1] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 static_assert(value_to_char5[2] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 static_assert(value_to_char5[3] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 static_assert(value_to_char5[4] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 static_assert(value_to_char5[5] == 'A');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 static_assert(value_to_char5[6] == 'C');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 static_assert(value_to_char5[7] == 'G');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 static_assert(value_to_char5[8] == 'T');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 static_assert(value_to_char5[9] == 'N');