//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef SUPPORT_MSVC_STDLIB_FORCE_INCLUDE_HPP
#define SUPPORT_MSVC_STDLIB_FORCE_INCLUDE_HPP

// This header is force-included when running the libc++ tests against the
// MSVC standard library.

#ifndef _LIBCXX_IN_DEVCRT
    // Silence warnings about CRT machinery.
    #define _CRT_SECURE_NO_WARNINGS

    // Avoid assertion dialogs.
    #define _CRT_SECURE_INVALID_PARAMETER(EXPR) ::abort()
#endif // _LIBCXX_IN_DEVCRT

#include <crtdbg.h>
#include <stdlib.h>

#if defined(_LIBCPP_VERSION)
    #error This header may not be used when targeting libc++
#endif

#ifndef _LIBCXX_IN_DEVCRT
struct AssertionDialogAvoider {
    AssertionDialogAvoider() {
        _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
        _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);

        _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
        _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
    }
};

const AssertionDialogAvoider assertion_dialog_avoider{};
#endif // _LIBCXX_IN_DEVCRT

// MSVC frontend only configurations
#if !defined(__clang__)
    // Simulate feature-test macros.
    #define __has_feature(X) _MSVC_HAS_FEATURE_ ## X
    #define _MSVC_HAS_FEATURE_cxx_exceptions    1
    #define _MSVC_HAS_FEATURE_cxx_rtti          1
    #define _MSVC_HAS_FEATURE_address_sanitizer 0
    #define _MSVC_HAS_FEATURE_memory_sanitizer  0
    #define _MSVC_HAS_FEATURE_thread_sanitizer  0

    #define __has_attribute(X) _MSVC_HAS_ATTRIBUTE_ ## X
    #define _MSVC_HAS_ATTRIBUTE_vector_size     0

    // Silence compiler warnings.
    #pragma warning(disable: 4180) // qualifier applied to function type has no meaning; ignored
    #pragma warning(disable: 4324) // structure was padded due to alignment specifier
    #pragma warning(disable: 4521) // multiple copy constructors specified
    #pragma warning(disable: 4702) // unreachable code
    #pragma warning(disable: 28251) // Inconsistent annotation for 'new': this instance has no annotations.
#endif // !defined(__clang__)

// MSVC doesn't have __int128_t.
#define _LIBCPP_HAS_NO_INT128

// MSVC has quick_exit() and at_quick_exit().
#define _LIBCPP_HAS_QUICK_EXIT

#ifndef _LIBCXX_IN_DEVCRT
    // atomic_is_lock_free.pass.cpp needs this VS 2015 Update 2 fix.
    #define _ENABLE_ATOMIC_ALIGNMENT_FIX

    // Silence warnings about features that are deprecated in C++17 and C++20.
    #define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
    #define _SILENCE_ALL_CXX20_DEPRECATION_WARNINGS
#endif // _LIBCXX_IN_DEVCRT

#include <ciso646>

#if _HAS_CXX20
    #define TEST_STD_VER 99
#elif _HAS_CXX17
    #define TEST_STD_VER 17
#else // !(_HAS_CXX20 || _HAS_CXX17)
    #define TEST_STD_VER 14
#endif

#define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST

#endif // SUPPORT_MSVC_STDLIB_FORCE_INCLUDE_HPP
