Daily bump.
[gcc.git] / gcc / testsuite / g++.dg / cpp0x / pr86379.C
blob82282eae8e52be4d4381ecfbc20d52f1e9bcb097
1 // { dg-do compile { target c++11 } }
3 // Reduced from Mozilla SpiderMonkey, licensed under MPL-2.0.
5 template<typename T, unsigned N>
6 class Vector
8   public:
9     Vector() {}
10     unsigned length() const { return 0; }
13 class TokenStreamShared
17 template<typename CharT, class AnyCharsAccess>
18 class TokenStreamSpecific;
20 class TokenStreamAnyChars
21   : public TokenStreamShared
23   public:
24     TokenStreamAnyChars() {}
27 template<typename CharT>
28 class SourceUnits
30   public:
31     SourceUnits() {}
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>;
42   protected:
43     CharBuffer charBuffer;
45   protected:
46     explicit TokenStreamCharsShared() {}
49 template<typename CharT>
50 class TokenStreamCharsBase
51   : public TokenStreamCharsShared
53   public:
54     TokenStreamCharsBase()
55       : TokenStreamCharsShared(), sourceUnits()
56     {}
58     using SourceUnits = ::SourceUnits<CharT>;
60     bool matchCodeUnit(int expect) { return true; }
62   protected:
63     SourceUnits sourceUnits;
66 template<typename CharT, class AnyCharsAccess>
67 class GeneralTokenStreamChars
68   : public TokenStreamCharsBase<CharT>
70     using CharsBase = TokenStreamCharsBase<CharT>;
72   protected:
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>
85   private:
86     using CharsBase = TokenStreamCharsBase<char16_t>;
87     using GeneralCharsBase = GeneralTokenStreamChars<char16_t, AnyCharsAccess>;
88     using Self = TokenStreamChars<char16_t, AnyCharsAccess>;
90   protected:
91     using GeneralCharsBase::anyCharsAccess;
92     using CharsBase::sourceUnits;
94     using typename GeneralCharsBase::SourceUnits;
96   protected:
97     using GeneralCharsBase::GeneralCharsBase;
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         }
109         *codePoint = '\n';
110         return true;
111     }
114 template<typename CharT, class AnyCharsAccess>
115 class TokenStreamSpecific
116   : public TokenStreamChars<CharT, AnyCharsAccess>,
117     public TokenStreamShared
119   public:
120     using CharsBase = TokenStreamCharsBase<CharT>;
121     using GeneralCharsBase = GeneralTokenStreamChars<CharT, AnyCharsAccess>;
122     using SpecializedCharsBase = TokenStreamChars<CharT, AnyCharsAccess>;
124   public:
125     using GeneralCharsBase::anyCharsAccess;
127   private:
128     using typename CharsBase::SourceUnits;
130   private:
131     using TokenStreamCharsShared::charBuffer;
132     using CharsBase::sourceUnits;
134   public:
135     TokenStreamSpecific()
136       : SpecializedCharsBase()
137     {}
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     }
147 class TokenStreamAnyCharsAccess
151 class TokenStream final
152   : public TokenStreamAnyChars,
153     public TokenStreamSpecific<char16_t, TokenStreamAnyCharsAccess>
155     using CharT = char16_t;
157   public:
158     TokenStream()
159     : TokenStreamAnyChars(),
160       TokenStreamSpecific<CharT, TokenStreamAnyCharsAccess>()
161     {}
164 class SyntaxParseHandler {};
166 class ParserBase
168   public:
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>
185 class Parser;
187 template <class ParseHandler, typename CharT>
188 class GeneralParser
189   : public PerHandlerParser<ParseHandler>
191   public:
192     TokenStreamSpecific<CharT, ParserAnyCharsAccess<GeneralParser>> tokenStream;
194   public:
195     GeneralParser();
199 template class TokenStreamCharsBase<char16_t>;
201 template class TokenStreamChars<char16_t, TokenStreamAnyCharsAccess>;
203 template class
204 TokenStreamChars<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>;
206 template class
207 TokenStreamSpecific<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>;