Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/cpp0x/pr86379.C @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:84e7813d76e9 | 145:1830386684a0 |
---|---|
1 // { dg-do compile { target c++11 } } | |
2 | |
3 // Reduced from Mozilla SpiderMonkey, licensed under MPL-2.0. | |
4 | |
5 template<typename T, unsigned N> | |
6 class Vector | |
7 { | |
8 public: | |
9 Vector() {} | |
10 unsigned length() const { return 0; } | |
11 }; | |
12 | |
13 class TokenStreamShared | |
14 { | |
15 }; | |
16 | |
17 template<typename CharT, class AnyCharsAccess> | |
18 class TokenStreamSpecific; | |
19 | |
20 class TokenStreamAnyChars | |
21 : public TokenStreamShared | |
22 { | |
23 public: | |
24 TokenStreamAnyChars() {} | |
25 }; | |
26 | |
27 template<typename CharT> | |
28 class SourceUnits | |
29 { | |
30 public: | |
31 SourceUnits() {} | |
32 | |
33 bool atEnd() const { return true; } | |
34 unsigned offset() const { return 0; } | |
35 bool matchCodeUnit(CharT c) { return true; } | |
36 }; | |
37 | |
38 class TokenStreamCharsShared | |
39 { | |
40 using CharBuffer = Vector<char16_t, 32>; | |
41 | |
42 protected: | |
43 CharBuffer charBuffer; | |
44 | |
45 protected: | |
46 explicit TokenStreamCharsShared() {} | |
47 }; | |
48 | |
49 template<typename CharT> | |
50 class TokenStreamCharsBase | |
51 : public TokenStreamCharsShared | |
52 { | |
53 public: | |
54 TokenStreamCharsBase() | |
55 : TokenStreamCharsShared(), sourceUnits() | |
56 {} | |
57 | |
58 using SourceUnits = ::SourceUnits<CharT>; | |
59 | |
60 bool matchCodeUnit(int expect) { return true; } | |
61 | |
62 protected: | |
63 SourceUnits sourceUnits; | |
64 }; | |
65 | |
66 template<typename CharT, class AnyCharsAccess> | |
67 class GeneralTokenStreamChars | |
68 : public TokenStreamCharsBase<CharT> | |
69 { | |
70 using CharsBase = TokenStreamCharsBase<CharT>; | |
71 | |
72 protected: | |
73 using CharsBase::CharsBase; | |
74 | |
75 TokenStreamAnyChars& anyCharsAccess(); | |
76 const TokenStreamAnyChars& anyCharsAccess() const; | |
77 }; | |
78 | |
79 template<typename CharT, class AnyCharsAccess> class TokenStreamChars; | |
80 | |
81 template<class AnyCharsAccess> | |
82 class TokenStreamChars<char16_t, AnyCharsAccess> | |
83 : public GeneralTokenStreamChars<char16_t, AnyCharsAccess> | |
84 { | |
85 private: | |
86 using CharsBase = TokenStreamCharsBase<char16_t>; | |
87 using GeneralCharsBase = GeneralTokenStreamChars<char16_t, AnyCharsAccess>; | |
88 using Self = TokenStreamChars<char16_t, AnyCharsAccess>; | |
89 | |
90 protected: | |
91 using GeneralCharsBase::anyCharsAccess; | |
92 using CharsBase::sourceUnits; | |
93 | |
94 using typename GeneralCharsBase::SourceUnits; | |
95 | |
96 protected: | |
97 using GeneralCharsBase::GeneralCharsBase; | |
98 | |
99 bool getFullAsciiCodePoint(int lead, int* codePoint) { | |
100 if (lead == '\r') { | |
101 bool isAtEnd = sourceUnits.atEnd(); | |
102 if (!isAtEnd) | |
103 sourceUnits.matchCodeUnit('\n'); | |
104 } else if (lead != '\n') { | |
105 *codePoint = lead; | |
106 return true; | |
107 } | |
108 | |
109 *codePoint = '\n'; | |
110 return true; | |
111 } | |
112 }; | |
113 | |
114 template<typename CharT, class AnyCharsAccess> | |
115 class TokenStreamSpecific | |
116 : public TokenStreamChars<CharT, AnyCharsAccess>, | |
117 public TokenStreamShared | |
118 { | |
119 public: | |
120 using CharsBase = TokenStreamCharsBase<CharT>; | |
121 using GeneralCharsBase = GeneralTokenStreamChars<CharT, AnyCharsAccess>; | |
122 using SpecializedCharsBase = TokenStreamChars<CharT, AnyCharsAccess>; | |
123 | |
124 public: | |
125 using GeneralCharsBase::anyCharsAccess; | |
126 | |
127 private: | |
128 using typename CharsBase::SourceUnits; | |
129 | |
130 private: | |
131 using TokenStreamCharsShared::charBuffer; | |
132 using CharsBase::sourceUnits; | |
133 | |
134 public: | |
135 TokenStreamSpecific() | |
136 : SpecializedCharsBase() | |
137 {} | |
138 | |
139 public: | |
140 bool advance(unsigned position) { | |
141 bool t = charBuffer.length() + 1 > 0; | |
142 auto offs = sourceUnits.offset(); | |
143 return t && offs > 0; | |
144 } | |
145 }; | |
146 | |
147 class TokenStreamAnyCharsAccess | |
148 { | |
149 }; | |
150 | |
151 class TokenStream final | |
152 : public TokenStreamAnyChars, | |
153 public TokenStreamSpecific<char16_t, TokenStreamAnyCharsAccess> | |
154 { | |
155 using CharT = char16_t; | |
156 | |
157 public: | |
158 TokenStream() | |
159 : TokenStreamAnyChars(), | |
160 TokenStreamSpecific<CharT, TokenStreamAnyCharsAccess>() | |
161 {} | |
162 }; | |
163 | |
164 class SyntaxParseHandler {}; | |
165 | |
166 class ParserBase | |
167 { | |
168 public: | |
169 TokenStreamAnyChars anyChars; | |
170 }; | |
171 | |
172 template<class ParseHandler, typename CharT> class GeneralParser; | |
173 | |
174 template <class ParseHandler> | |
175 class PerHandlerParser : public ParserBase | |
176 { | |
177 }; | |
178 | |
179 template<class Parser> | |
180 class ParserAnyCharsAccess | |
181 { | |
182 }; | |
183 | |
184 template <class ParseHandler, typename CharT> | |
185 class Parser; | |
186 | |
187 template <class ParseHandler, typename CharT> | |
188 class GeneralParser | |
189 : public PerHandlerParser<ParseHandler> | |
190 { | |
191 public: | |
192 TokenStreamSpecific<CharT, ParserAnyCharsAccess<GeneralParser>> tokenStream; | |
193 | |
194 public: | |
195 GeneralParser(); | |
196 }; | |
197 | |
198 | |
199 template class TokenStreamCharsBase<char16_t>; | |
200 | |
201 template class TokenStreamChars<char16_t, TokenStreamAnyCharsAccess>; | |
202 | |
203 template class | |
204 TokenStreamChars<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>; | |
205 | |
206 template class | |
207 TokenStreamSpecific<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>; |