Files
clang-p2996/libcxx/test/support/msvc_stdlib_force_include.h
Stephan T. Lavavej 64addd6521 [libc++][test] Enhance ADDITIONAL_COMPILE_FLAGS, use TEST_MEOW_DIAGNOSTIC_IGNORED sparingly (#75317)
This is the last PR that's needed (for now) to get libc++'s tests
working with MSVC's STL.

The ADDITIONAL_COMPILE_FLAGS machinery is very useful, but also very
problematic for MSVC, as it doesn't understand most of Clang's compiler
options. We've been dealing with this by simply marking anything that
uses ADDITIONAL_COMPILE_FLAGS as FAIL or SKIPPED, but that creates
significant gaps in test coverage.

Fortunately, ADDITIONAL_COMPILE_FLAGS also supports "features", which
can be slightly enhanced to send Clang-compatible and MSVC-compatible
options to the right compilers.

This patch adds the gcc-style-warnings and cl-style-warnings Lit features,
and uses that to pass the appropriate warning flags to tests. It also uses
TEST_MEOW_DIAGNOSTIC_IGNORED for a few local suppressions of MSVC
warnings.
2023-12-14 17:38:27 -05:00

108 lines
3.5 KiB
C

//===----------------------------------------------------------------------===//
//
// 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_H
#define SUPPORT_MSVC_STDLIB_FORCE_INCLUDE_H
// 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 1
// Avoid assertion dialogs.
# define _CRT_SECURE_INVALID_PARAMETER(EXPR) ::abort()
// Declare POSIX function names. (By default, Clang -fno-ms-compatibility causes them to be omitted.)
# define _CRT_DECLARE_NONSTDC_NAMES 1
// Silence warnings about POSIX function names.
# define _CRT_NONSTDC_NO_WARNINGS 1
// Avoid Windows.h macroizing min() and max().
# define NOMINMAX 1
#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_hwaddress_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__)
#ifndef _LIBCXX_IN_DEVCRT
// atomic_is_lock_free.pass.cpp needs this VS 2015 Update 2 fix.
# define _ENABLE_ATOMIC_ALIGNMENT_FIX
// Restore features that are removed in C++20.
# define _HAS_FEATURES_REMOVED_IN_CXX20 1
// Silence warnings about the unspecified complex<non-floating-point>
# define _SILENCE_NONFLOATING_COMPLEX_DEPRECATION_WARNING
// Silence warnings about features that are deprecated in non-default language modes.
# define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
# define _SILENCE_ALL_CXX20_DEPRECATION_WARNINGS
# define _SILENCE_ALL_CXX23_DEPRECATION_WARNINGS
#endif // _LIBCXX_IN_DEVCRT
#include <version>
#if _HAS_CXX23
# define TEST_STD_VER 99
#elif _HAS_CXX20
# define TEST_STD_VER 20
#elif _HAS_CXX17
# define TEST_STD_VER 17
#else
# define TEST_STD_VER 14
#endif
#define TEST_SHORT_WCHAR
#define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
#endif // SUPPORT_MSVC_STDLIB_FORCE_INCLUDE_H