blob: 82282eae8e52be4d4381ecfbc20d52f1e9bcb097 [file] [log] [blame]
// { dg-do compile { target c++11 } }
// Reduced from Mozilla SpiderMonkey, licensed under MPL-2.0.
template<typename T, unsigned N>
class Vector
{
public:
Vector() {}
unsigned length() const { return 0; }
};
class TokenStreamShared
{
};
template<typename CharT, class AnyCharsAccess>
class TokenStreamSpecific;
class TokenStreamAnyChars
: public TokenStreamShared
{
public:
TokenStreamAnyChars() {}
};
template<typename CharT>
class SourceUnits
{
public:
SourceUnits() {}
bool atEnd() const { return true; }
unsigned offset() const { return 0; }
bool matchCodeUnit(CharT c) { return true; }
};
class TokenStreamCharsShared
{
using CharBuffer = Vector<char16_t, 32>;
protected:
CharBuffer charBuffer;
protected:
explicit TokenStreamCharsShared() {}
};
template<typename CharT>
class TokenStreamCharsBase
: public TokenStreamCharsShared
{
public:
TokenStreamCharsBase()
: TokenStreamCharsShared(), sourceUnits()
{}
using SourceUnits = ::SourceUnits<CharT>;
bool matchCodeUnit(int expect) { return true; }
protected:
SourceUnits sourceUnits;
};
template<typename CharT, class AnyCharsAccess>
class GeneralTokenStreamChars
: public TokenStreamCharsBase<CharT>
{
using CharsBase = TokenStreamCharsBase<CharT>;
protected:
using CharsBase::CharsBase;
TokenStreamAnyChars& anyCharsAccess();
const TokenStreamAnyChars& anyCharsAccess() const;
};
template<typename CharT, class AnyCharsAccess> class TokenStreamChars;
template<class AnyCharsAccess>
class TokenStreamChars<char16_t, AnyCharsAccess>
: public GeneralTokenStreamChars<char16_t, AnyCharsAccess>
{
private:
using CharsBase = TokenStreamCharsBase<char16_t>;
using GeneralCharsBase = GeneralTokenStreamChars<char16_t, AnyCharsAccess>;
using Self = TokenStreamChars<char16_t, AnyCharsAccess>;
protected:
using GeneralCharsBase::anyCharsAccess;
using CharsBase::sourceUnits;
using typename GeneralCharsBase::SourceUnits;
protected:
using GeneralCharsBase::GeneralCharsBase;
bool getFullAsciiCodePoint(int lead, int* codePoint) {
if (lead == '\r') {
bool isAtEnd = sourceUnits.atEnd();
if (!isAtEnd)
sourceUnits.matchCodeUnit('\n');
} else if (lead != '\n') {
*codePoint = lead;
return true;
}
*codePoint = '\n';
return true;
}
};
template<typename CharT, class AnyCharsAccess>
class TokenStreamSpecific
: public TokenStreamChars<CharT, AnyCharsAccess>,
public TokenStreamShared
{
public:
using CharsBase = TokenStreamCharsBase<CharT>;
using GeneralCharsBase = GeneralTokenStreamChars<CharT, AnyCharsAccess>;
using SpecializedCharsBase = TokenStreamChars<CharT, AnyCharsAccess>;
public:
using GeneralCharsBase::anyCharsAccess;
private:
using typename CharsBase::SourceUnits;
private:
using TokenStreamCharsShared::charBuffer;
using CharsBase::sourceUnits;
public:
TokenStreamSpecific()
: SpecializedCharsBase()
{}
public:
bool advance(unsigned position) {
bool t = charBuffer.length() + 1 > 0;
auto offs = sourceUnits.offset();
return t && offs > 0;
}
};
class TokenStreamAnyCharsAccess
{
};
class TokenStream final
: public TokenStreamAnyChars,
public TokenStreamSpecific<char16_t, TokenStreamAnyCharsAccess>
{
using CharT = char16_t;
public:
TokenStream()
: TokenStreamAnyChars(),
TokenStreamSpecific<CharT, TokenStreamAnyCharsAccess>()
{}
};
class SyntaxParseHandler {};
class ParserBase
{
public:
TokenStreamAnyChars anyChars;
};
template<class ParseHandler, typename CharT> class GeneralParser;
template <class ParseHandler>
class PerHandlerParser : public ParserBase
{
};
template<class Parser>
class ParserAnyCharsAccess
{
};
template <class ParseHandler, typename CharT>
class Parser;
template <class ParseHandler, typename CharT>
class GeneralParser
: public PerHandlerParser<ParseHandler>
{
public:
TokenStreamSpecific<CharT, ParserAnyCharsAccess<GeneralParser>> tokenStream;
public:
GeneralParser();
};
template class TokenStreamCharsBase<char16_t>;
template class TokenStreamChars<char16_t, TokenStreamAnyCharsAccess>;
template class
TokenStreamChars<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>;
template class
TokenStreamSpecific<char16_t, ParserAnyCharsAccess<GeneralParser<SyntaxParseHandler, char16_t>>>;