view 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
line wrap: on
line source

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