xref: /llvm-project/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_final.pass.cpp (revision 31cbe0f240f660f15602c96b787c58a26f17e179)
15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
9*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11
105a83710eSEric Fiselier // type_traits
115a83710eSEric Fiselier 
125a83710eSEric Fiselier // is_final
135a83710eSEric Fiselier 
145a83710eSEric Fiselier #include <type_traits>
15d17405feSMarshall Clow #include "test_macros.h"
165a83710eSEric Fiselier 
175a83710eSEric Fiselier struct P final { };
185a83710eSEric Fiselier union U1 { };
195a83710eSEric Fiselier union U2 final { };
205a83710eSEric Fiselier 
215a83710eSEric Fiselier template <class T>
test_is_final()225a83710eSEric Fiselier void test_is_final()
235a83710eSEric Fiselier {
245a83710eSEric Fiselier     static_assert( std::is_final<T>::value, "");
255a83710eSEric Fiselier     static_assert( std::is_final<const T>::value, "");
265a83710eSEric Fiselier     static_assert( std::is_final<volatile T>::value, "");
275a83710eSEric Fiselier     static_assert( std::is_final<const volatile T>::value, "");
28dd0ef099SMarshall Clow #if TEST_STD_VER > 14
29dd0ef099SMarshall Clow     static_assert( std::is_final_v<T>, "");
30dd0ef099SMarshall Clow     static_assert( std::is_final_v<const T>, "");
31dd0ef099SMarshall Clow     static_assert( std::is_final_v<volatile T>, "");
32dd0ef099SMarshall Clow     static_assert( std::is_final_v<const volatile T>, "");
33dd0ef099SMarshall Clow #endif
345a83710eSEric Fiselier }
355a83710eSEric Fiselier 
365a83710eSEric Fiselier template <class T>
test_is_not_final()375a83710eSEric Fiselier void test_is_not_final()
385a83710eSEric Fiselier {
395a83710eSEric Fiselier     static_assert(!std::is_final<T>::value, "");
405a83710eSEric Fiselier     static_assert(!std::is_final<const T>::value, "");
415a83710eSEric Fiselier     static_assert(!std::is_final<volatile T>::value, "");
425a83710eSEric Fiselier     static_assert(!std::is_final<const volatile T>::value, "");
43dd0ef099SMarshall Clow #if TEST_STD_VER > 14
44dd0ef099SMarshall Clow     static_assert(!std::is_final_v<T>, "");
45dd0ef099SMarshall Clow     static_assert(!std::is_final_v<const T>, "");
46dd0ef099SMarshall Clow     static_assert(!std::is_final_v<volatile T>, "");
47dd0ef099SMarshall Clow     static_assert(!std::is_final_v<const volatile T>, "");
48dd0ef099SMarshall Clow #endif
495a83710eSEric Fiselier }
505a83710eSEric Fiselier 
main(int,char **)512df59c50SJF Bastien int main(int, char**)
525a83710eSEric Fiselier {
535a83710eSEric Fiselier     test_is_not_final<int>();
545a83710eSEric Fiselier     test_is_not_final<int*>();
555a83710eSEric Fiselier     test_is_final    <P>();
565a83710eSEric Fiselier     test_is_not_final<P*>();
575a83710eSEric Fiselier     test_is_not_final<U1>();
585a83710eSEric Fiselier     test_is_not_final<U1*>();
595a83710eSEric Fiselier     test_is_final    <U2>();
605a83710eSEric Fiselier     test_is_not_final<U2*>();
612df59c50SJF Bastien 
622df59c50SJF Bastien   return 0;
635a83710eSEric Fiselier }
64