// Copyright (C) 2021-2022 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-options "-std=gnu++23" } // { dg-do compile { target c++23 } } #include #ifndef __cpp_lib_is_scoped_enum # error "Feature test macro for is_scoped_enum is missing in " #elif __cpp_lib_is_scoped_enum < 202011L # error "Feature test macro for is_scoped_enum has wrong value in " #endif #include template concept Is_scoped_enum = __gnu_test::test_category(true); struct Incomplete_struct; void test01() { enum class E { e1, e2 }; static_assert( Is_scoped_enum ); enum class Ec : char { e1, e2 }; static_assert( Is_scoped_enum ); // negative tests enum U { u1, u2 }; static_assert( ! Is_scoped_enum ); enum F : int { f1, f2 }; static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); struct S; static_assert( ! Is_scoped_enum ); struct S { }; static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); static_assert( ! Is_scoped_enum ); } enum opaque_unscoped : short; enum class opaque_scoped; enum class opaque_scoped_with_base : long; static_assert( ! Is_scoped_enum ); static_assert( Is_scoped_enum ); static_assert( Is_scoped_enum ); void test02() { enum unscoped { u_is_enum = std::is_enum_v, u_is_scoped = std::is_scoped_enum_v, }; static_assert( unscoped::u_is_enum ); static_assert( ! unscoped::u_is_scoped ); enum unscoped_fixed : char { uf_is_enum = std::is_enum_v, uf_is_scoped = std::is_scoped_enum_v, }; static_assert( unscoped_fixed::uf_is_enum); static_assert( ! unscoped_fixed::uf_is_scoped ); enum class scoped { is_enum = std::is_enum_v, is_scoped = std::is_scoped_enum_v, }; static_assert( (bool) scoped::is_enum ); static_assert( (bool) scoped::is_scoped ); }