1 // { dg-do compile { target c++11 } }
3 // Reduced from Mozilla SpiderMonkey, licensed under MPL-2.0.
5 template<typename T, unsigned N>
10 unsigned length() const { return 0; }
13 class TokenStreamShared
17 template<typename CharT, class AnyCharsAccess>
18 class TokenStreamSpecific;
20 class TokenStreamAnyChars
21 : public TokenStreamShared
24 TokenStreamAnyChars() {}
27 template<typename CharT>
33 bool atEnd() const { return true; }
34 unsigned offset() const { return 0; }
35 bool matchCodeUnit(CharT c) { return true; }
38 class TokenStreamCharsShared
40 using CharBuffer = Vector<char16_t, 32>;
43 CharBuffer charBuffer;
46 explicit TokenStreamCharsShared() {}
49 template<typename CharT>
50 class TokenStreamCharsBase
51 : public TokenStreamCharsShared
54 TokenStreamCharsBase()
55 : TokenStreamCharsShared(), sourceUnits()
58 using SourceUnits = ::SourceUnits<CharT>;
60 bool matchCodeUnit(int expect) { return true; }
63 SourceUnits sourceUnits;
66 template<typename CharT, class AnyCharsAccess>
67 class GeneralTokenStreamChars
68 : public TokenStreamCharsBase<CharT>
70 using CharsBase = TokenStreamCharsBase<CharT>;
73 using CharsBase::CharsBase;
75 TokenStreamAnyChars& anyCharsAccess();
76 const TokenStreamAnyChars& anyCharsAccess() const;
79 template<typename CharT, class AnyCharsAccess> class TokenStreamChars;
81 template<class AnyCharsAccess>
82 class TokenStreamChars<char16_t, AnyCharsAccess>
83 : public GeneralTokenStreamChars<char16_t, AnyCharsAccess>
86 using CharsBase = TokenStreamCharsBase<char16_t>;
87 using GeneralCharsBase = GeneralTokenStreamChars<char16_t, AnyCharsAccess>;
88 using Self = TokenStreamChars<char16_t, AnyCharsAccess>;
91 using GeneralCharsBase::anyCharsAccess;
92 using CharsBase::sourceUnits;
94 using typename GeneralCharsBase::SourceUnits;
97 using GeneralCharsBase::GeneralCharsBase;
99 bool getFullAsciiCodePoint(int lead, int* codePoint) {
101 bool isAtEnd = sourceUnits.atEnd();
103 sourceUnits.matchCodeUnit('\n');
104 } else if (lead != '\n') {
114 template<typename CharT, class AnyCharsAccess>
115 class TokenStreamSpecific
116 : public TokenStreamChars<CharT, AnyCharsAccess>,
117 public TokenStreamShared
120 using CharsBase = TokenStreamCharsBase<CharT>;
121 using GeneralCharsBase = GeneralTokenStreamChars<CharT, AnyCharsAccess>;
122 using SpecializedCharsBase = TokenStreamChars<CharT, AnyCharsAccess>;
125 using GeneralCharsBase::anyCharsAccess;
128 using typename CharsBase::SourceUnits;
131 using TokenStreamCharsShared::charBuffer;
132 using CharsBase::sourceUnits;
135 TokenStreamSpecific()
136 : SpecializedCharsBase()
140 bool advance(unsigned position) {
141 bool t = charBuffer.length() + 1 > 0;
142 auto offs = sourceUnits.offset();
143 return t && offs > 0;
147 class TokenStreamAnyCharsAccess
151 class TokenStream final
152 : public TokenStreamAnyChars,
153 public TokenStreamSpecific<char16_t, TokenStreamAnyCharsAccess>
155 using CharT = char16_t;
159 : TokenStreamAnyChars(),
160 TokenStreamSpecific<CharT, TokenStreamAnyCharsAccess>()
164 class SyntaxParseHandler {};
169 TokenStreamAnyChars anyChars;
172 template<class ParseHandler, typename CharT> class GeneralParser;
174 template <class ParseHandler>
175 class PerHandlerParser : public ParserBase
179 template<class Parser>
180 class ParserAnyCharsAccess
184 template <class ParseHandler, typename CharT>
187 template <class ParseHandler, typename CharT>
189 : public PerHandlerParser<ParseHandler>
192 TokenStreamSpecific<CharT, ParserAnyCharsAccess<GeneralParser>> tokenStream;
199 template class TokenStreamCharsBase<char16_t>;
201 template class TokenStreamChars<char16_t, TokenStreamAnyCharsAccess>;
204 TokenStreamChars<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>;
207 TokenStreamSpecific<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>;