Mercurial > hg > CbC > CbC_gcc
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>>>;