#pragma once // Sample file for parse_enum unittests #include #include // Test template declarations template void Func(T&); template<> void Func(struct ENonDeclared&); template class TFwdDecl; // Test in-function class declarations void InexistentFunction(struct TFwdStructDecl); void InexistentFunction2(struct TFwdStructDecl, class TMegaClass); static inline void Func() { class TLocal { int M; public: void F() { // to shut up clang Y_UNUSED(M); } }; { // unnamed block } } // Test forward declarations, pt 2 namespace NTestContainer { struct TStruct; } // Enums enum ESimple { Http, Https, ItemCount }; enum class ESimpleWithComma { Http = 3, Http2 = Http, Https, // 4 ItemCount, // 5 }; enum ECustomAliases { CAHttp = 3 /* "http" */, CAHttps /* "https" */, CAItemCount, }; enum EMultipleAliases { MAHttp = 9 /* "http://" "secondary" "old\nvalue" */, MAHttps = 1 /* "https://" */, MAItemCount, }; namespace NEnumNamespace { enum EInNamespace { Http = 9 /* "http://" "secondary" "old\nvalue" */, Https = 1 /* "https://" */, ItemCount /* "real value" */, }; }; struct TStruct { int M; }; namespace NEnumNamespace { class TEnumClass: public TStruct { public: enum EInClass { Http = 9 /* "http://" "secondary" "old\nvalue" */, Https1 = NEnumNamespace::Https /* "https://" */, // holy crap, this will work too: Https3 = 1 /* "https://" */ + 2, }; }; } enum { One, Two, Three, }; struct { int M; } SomeStruct; static inline void f() { (void)(SomeStruct); (void)(f); } // buggy case taken from library/cpp/html/face/parstypes.h enum TEXT_WEIGHT { WEIGHT_ZERO=-1,// NOINDEX_RELEV WEIGHT_LOW, // LOW_RELEV WEIGHT_NORMAL, // NORMAL_RELEV WEIGHT_HIGH, // HIGH_RELEV (H1,H2,H3,ADDRESS,CAPTION) WEIGHT_BEST // BEST_RELEV (TITLE) }; // enum with duplicate keys enum EDuplicateKeys { Key0 = 0, Key0Second = Key0, Key1, Key2 = 3 /* "k2" "k2.1" */, Key3 = 3 /* "k3" */, }; enum class EFwdEnum; void FunctionUsingEFwdEnum(EFwdEnum); enum class EFwdEnum { One, Two }; // empty enum (bug found by sankear@) enum EEmpty { }; namespace NComposite::NInner { enum EInCompositeNamespaceSimple { one, two = 2, three, }; } namespace NOuterSimple { namespace NComposite::NMiddle::NInner { namespace NInnerSimple { class TEnumClass { public: enum EVeryDeep { Key0 = 0, Key1 = 1, }; }; } } } constexpr int func(int value) { return value; } #define MACRO(x, y) x // enum with nonliteral values enum ENonLiteralValues { one = MACRO(1, 2), two = 2, three = func(3), four, five = MACRO(MACRO(1, 2), 2), }; #undef MACRO enum EDestructionPriorityTest { first, second }; enum class NotifyingStatus { NEW = 0, FAILED_WILL_RETRY = 1, FAILED_NO_MORE_TRIALS = 2, SENT = 3 }; /* * Still unsupported features: * * a) Anonymous namespaces (it is parsed correctly, though) * b) Enums inside template classes (impossible by design) **/