1f7b43230SLouis Dionne //===----------------------------------------------------------------------===// 2f7b43230SLouis Dionne // 3f7b43230SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f7b43230SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5f7b43230SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f7b43230SLouis Dionne // 7f7b43230SLouis Dionne //===----------------------------------------------------------------------===// 8f7b43230SLouis Dionne 931cbe0f2SLouis Dionne // UNSUPPORTED: c++03 10f7b43230SLouis Dionne 11f7b43230SLouis Dionne // <filesystem> 12f7b43230SLouis Dionne 13f7b43230SLouis Dionne // enum class copy_options; 14f7b43230SLouis Dionne 15cc89063bSNico Weber #include "filesystem_include.h" 16f7b43230SLouis Dionne #include <type_traits> 17f7b43230SLouis Dionne #include <cassert> 18f7b43230SLouis Dionne 190f3efc4aSNico Weber #include "check_bitmask_types.h" 20f7b43230SLouis Dionne #include "test_macros.h" 21f7b43230SLouis Dionne 22f7b43230SLouis Dionne 23f7b43230SLouis Dionne constexpr fs::copy_options ME(int val) { return static_cast<fs::copy_options>(val); } 24f7b43230SLouis Dionne 25f7b43230SLouis Dionne int main(int, char**) { 26f7b43230SLouis Dionne typedef fs::copy_options E; 27f7b43230SLouis Dionne static_assert(std::is_enum<E>::value, ""); 28f7b43230SLouis Dionne 29f7b43230SLouis Dionne // Check that E is a scoped enum by checking for conversions. 30f7b43230SLouis Dionne typedef std::underlying_type<E>::type UT; 31f7b43230SLouis Dionne static_assert(!std::is_convertible<E, UT>::value, ""); 32f7b43230SLouis Dionne 33*66427d73SMartin Storsjö LIBCPP_ONLY(static_assert(std::is_same<UT, unsigned short>::value, "")); // Implementation detail 34f7b43230SLouis Dionne 35f7b43230SLouis Dionne typedef check_bitmask_type<E, E::skip_existing, E::update_existing> BitmaskTester; 36f7b43230SLouis Dionne assert(BitmaskTester::check()); 37f7b43230SLouis Dionne 38f7b43230SLouis Dionne static_assert( 39f7b43230SLouis Dionne E::none == ME(0), 40f7b43230SLouis Dionne "Expected enumeration values do not match"); 41f7b43230SLouis Dionne // Option group for copy_file 42f7b43230SLouis Dionne static_assert( 43f7b43230SLouis Dionne E::skip_existing == ME(1) && 44f7b43230SLouis Dionne E::overwrite_existing == ME(2) && 45f7b43230SLouis Dionne E::update_existing == ME(4), 46f7b43230SLouis Dionne "Expected enumeration values do not match"); 47f7b43230SLouis Dionne // Option group for copy on directories 48f7b43230SLouis Dionne static_assert( 49f7b43230SLouis Dionne E::recursive == ME(8), 50f7b43230SLouis Dionne "Expected enumeration values do not match"); 51f7b43230SLouis Dionne // Option group for copy on symlinks 52f7b43230SLouis Dionne static_assert( 53f7b43230SLouis Dionne E::copy_symlinks == ME(16) && 54f7b43230SLouis Dionne E::skip_symlinks == ME(32), 55f7b43230SLouis Dionne "Expected enumeration values do not match"); 56f7b43230SLouis Dionne // Option group for changing form of copy 57f7b43230SLouis Dionne static_assert( 58f7b43230SLouis Dionne E::directories_only == ME(64) && 59f7b43230SLouis Dionne E::create_symlinks == ME(128) && 60f7b43230SLouis Dionne E::create_hard_links == ME(256), 61f7b43230SLouis Dionne "Expected enumeration values do not match"); 62f7b43230SLouis Dionne 63f7b43230SLouis Dionne return 0; 64f7b43230SLouis Dionne } 65