17d297de9SAndy Yankovsky #include <limits>
27d297de9SAndy Yankovsky 
37d297de9SAndy Yankovsky enum Enum {
47d297de9SAndy Yankovsky   enum_case1 = 1,
57d297de9SAndy Yankovsky   enum_case2 = 2,
67d297de9SAndy Yankovsky };
77d297de9SAndy Yankovsky 
87d297de9SAndy Yankovsky enum class ScopedEnum {
97d297de9SAndy Yankovsky   scoped_enum_case1 = 1,
107d297de9SAndy Yankovsky   scoped_enum_case2 = 2,
117d297de9SAndy Yankovsky };
127d297de9SAndy Yankovsky 
137d297de9SAndy Yankovsky enum class ScopedCharEnum : char {
147d297de9SAndy Yankovsky   case1 = 1,
157d297de9SAndy Yankovsky   case2 = 2,
167d297de9SAndy Yankovsky };
177d297de9SAndy Yankovsky 
187d297de9SAndy Yankovsky enum class ScopedLongLongEnum : long long {
197d297de9SAndy Yankovsky   case0 = std::numeric_limits<long long>::min(),
207d297de9SAndy Yankovsky   case1 = 1,
217d297de9SAndy Yankovsky   case2 = std::numeric_limits<long long>::max(),
227d297de9SAndy Yankovsky };
237d297de9SAndy Yankovsky 
247d297de9SAndy Yankovsky struct A {
257d297de9SAndy Yankovsky   const static int int_val = 1;
267d297de9SAndy Yankovsky   const static int int_val_with_address = 2;
277d297de9SAndy Yankovsky   const static bool bool_val = true;
287d297de9SAndy Yankovsky 
297d297de9SAndy Yankovsky   const static auto char_max = std::numeric_limits<signed char>::max();
307d297de9SAndy Yankovsky   const static auto uchar_max = std::numeric_limits<unsigned char>::max();
317d297de9SAndy Yankovsky   const static auto int_max = std::numeric_limits<int>::max();
327d297de9SAndy Yankovsky   const static auto uint_max = std::numeric_limits<unsigned>::max();
337d297de9SAndy Yankovsky   const static auto long_max = std::numeric_limits<long>::max();
347d297de9SAndy Yankovsky   const static auto ulong_max = std::numeric_limits<unsigned long>::max();
357d297de9SAndy Yankovsky   const static auto longlong_max = std::numeric_limits<long long>::max();
367d297de9SAndy Yankovsky   const static auto ulonglong_max =
377d297de9SAndy Yankovsky       std::numeric_limits<unsigned long long>::max();
387d297de9SAndy Yankovsky 
397d297de9SAndy Yankovsky   const static auto char_min = std::numeric_limits<char>::min();
407d297de9SAndy Yankovsky   const static auto uchar_min = std::numeric_limits<unsigned char>::min();
417d297de9SAndy Yankovsky   const static auto int_min = std::numeric_limits<int>::min();
427d297de9SAndy Yankovsky   const static auto uint_min = std::numeric_limits<unsigned>::min();
437d297de9SAndy Yankovsky   const static auto long_min = std::numeric_limits<long>::min();
447d297de9SAndy Yankovsky   const static auto ulong_min = std::numeric_limits<unsigned long>::min();
457d297de9SAndy Yankovsky   const static auto longlong_min = std::numeric_limits<long long>::min();
467d297de9SAndy Yankovsky   const static auto ulonglong_min =
477d297de9SAndy Yankovsky       std::numeric_limits<unsigned long long>::min();
487d297de9SAndy Yankovsky 
497d297de9SAndy Yankovsky   const static Enum enum_val = enum_case2;
507d297de9SAndy Yankovsky   const static Enum invalid_enum_val = static_cast<Enum>(enum_case2 + 5);
517d297de9SAndy Yankovsky   const static ScopedEnum scoped_enum_val = ScopedEnum::scoped_enum_case2;
527d297de9SAndy Yankovsky   const static ScopedEnum invalid_scoped_enum_val = static_cast<ScopedEnum>(5);
537d297de9SAndy Yankovsky   const static ScopedCharEnum scoped_char_enum_val = ScopedCharEnum::case2;
547d297de9SAndy Yankovsky   const static ScopedLongLongEnum scoped_ll_enum_val_neg =
557d297de9SAndy Yankovsky       ScopedLongLongEnum::case0;
567d297de9SAndy Yankovsky   const static ScopedLongLongEnum scoped_ll_enum_val =
577d297de9SAndy Yankovsky       ScopedLongLongEnum::case2;
587d297de9SAndy Yankovsky };
597d297de9SAndy Yankovsky 
607d297de9SAndy Yankovsky const int A::int_val_with_address;
617d297de9SAndy Yankovsky 
627d297de9SAndy Yankovsky struct ClassWithOnlyConstStatic {
637d297de9SAndy Yankovsky   const static int member = 3;
647d297de9SAndy Yankovsky };
657d297de9SAndy Yankovsky 
667d297de9SAndy Yankovsky struct ClassWithConstexprs {
677d297de9SAndy Yankovsky   constexpr static int member = 2;
687d297de9SAndy Yankovsky   constexpr static Enum enum_val = enum_case2;
697d297de9SAndy Yankovsky   constexpr static ScopedEnum scoped_enum_val = ScopedEnum::scoped_enum_case2;
707d297de9SAndy Yankovsky } cwc;
717d297de9SAndy Yankovsky 
72*140bcd36SMichael Buch struct ClassWithEnumAlias {
73*140bcd36SMichael Buch   using EnumAlias = ScopedEnum;
74*140bcd36SMichael Buch   static constexpr EnumAlias enum_alias = ScopedEnum::scoped_enum_case2;
75*140bcd36SMichael Buch 
76*140bcd36SMichael Buch   using EnumAliasAlias = EnumAlias;
77*140bcd36SMichael Buch   static constexpr EnumAliasAlias enum_alias_alias =
78*140bcd36SMichael Buch       ScopedEnum::scoped_enum_case1;
79*140bcd36SMichael Buch };
80*140bcd36SMichael Buch 
main()817d297de9SAndy Yankovsky int main() {
827d297de9SAndy Yankovsky   A a;
837d297de9SAndy Yankovsky 
847d297de9SAndy Yankovsky   auto char_max = A::char_max;
857d297de9SAndy Yankovsky   auto uchar_max = A::uchar_max;
867d297de9SAndy Yankovsky   auto int_max = A::int_max;
877d297de9SAndy Yankovsky   auto uint_max = A::uint_max;
887d297de9SAndy Yankovsky   auto long_max = A::long_max;
897d297de9SAndy Yankovsky   auto ulong_max = A::ulong_max;
907d297de9SAndy Yankovsky   auto longlong_max = A::longlong_max;
917d297de9SAndy Yankovsky   auto ulonglong_max = A::ulonglong_max;
927d297de9SAndy Yankovsky 
937d297de9SAndy Yankovsky   auto char_min = A::char_min;
947d297de9SAndy Yankovsky   auto uchar_min = A::uchar_min;
957d297de9SAndy Yankovsky   auto int_min = A::int_min;
967d297de9SAndy Yankovsky   auto uint_min = A::uint_min;
977d297de9SAndy Yankovsky   auto long_min = A::long_min;
987d297de9SAndy Yankovsky   auto ulong_min = A::ulong_min;
997d297de9SAndy Yankovsky   auto longlong_min = A::longlong_min;
1007d297de9SAndy Yankovsky   auto ulonglong_min = A::ulonglong_min;
1017d297de9SAndy Yankovsky 
1027d297de9SAndy Yankovsky   int member_copy = ClassWithOnlyConstStatic::member;
1037d297de9SAndy Yankovsky 
1047d297de9SAndy Yankovsky   Enum e = A::enum_val;
1057d297de9SAndy Yankovsky   e = A::invalid_enum_val;
1067d297de9SAndy Yankovsky   ScopedEnum se = A::scoped_enum_val;
1077d297de9SAndy Yankovsky   se = A::invalid_scoped_enum_val;
1087d297de9SAndy Yankovsky   ScopedCharEnum sce = A::scoped_char_enum_val;
1097d297de9SAndy Yankovsky   ScopedLongLongEnum sle = A::scoped_ll_enum_val;
110*140bcd36SMichael Buch 
111*140bcd36SMichael Buch   auto enum_alias_val = ClassWithEnumAlias::enum_alias;
112*140bcd36SMichael Buch   auto enum_alias_alias_val = ClassWithEnumAlias::enum_alias_alias;
113*140bcd36SMichael Buch 
1147d297de9SAndy Yankovsky   return 0; // break here
1157d297de9SAndy Yankovsky }
116