// { 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>>>;