Skip to content

Commit 64addd6

Browse files
[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.
1 parent 4070dff commit 64addd6

File tree

35 files changed

+96
-42
lines changed

35 files changed

+96
-42
lines changed

libcxx/test/std/algorithms/alg.modifying.operations/alg.replace/ranges.replace.pass.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
// MSVC warning C4244: 'argument': conversion from 'const _Ty2' to 'T', possible loss of data
10+
// ADDITIONAL_COMPILE_FLAGS(cl-style-warnings): /wd4244
11+
912
// <algorithm>
1013

1114
// UNSUPPORTED: c++03, c++11, c++14, c++17

libcxx/test/std/algorithms/alg.nonmodifying/alg.equal/equal.pass.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
// equal(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2);
2020

2121
// We test the cartesian product, so we sometimes compare differently signed types
22-
// ADDITIONAL_COMPILE_FLAGS: -Wno-sign-compare
22+
// ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-sign-compare
23+
// MSVC warning C4242: 'argument': conversion from 'int' to 'const _Ty', possible loss of data
24+
// MSVC warning C4244: 'argument': conversion from 'wchar_t' to 'const _Ty', possible loss of data
25+
// MSVC warning C4389: '==': signed/unsigned mismatch
26+
// ADDITIONAL_COMPILE_FLAGS(cl-style-warnings): /wd4242 /wd4244 /wd4389
2327

2428
#include <algorithm>
2529
#include <cassert>
@@ -58,6 +62,10 @@ struct Test {
5862
struct TestNarrowingEqualTo {
5963
template <class UnderlyingType>
6064
TEST_CONSTEXPR_CXX20 void operator()() {
65+
TEST_DIAGNOSTIC_PUSH
66+
// MSVC warning C4310: cast truncates constant value
67+
TEST_MSVC_DIAGNOSTIC_IGNORED(4310)
68+
6169
UnderlyingType a[] = {
6270
UnderlyingType(0x1000),
6371
UnderlyingType(0x1001),
@@ -71,6 +79,8 @@ struct TestNarrowingEqualTo {
7179
UnderlyingType(0x1603),
7280
UnderlyingType(0x1604)};
7381

82+
TEST_DIAGNOSTIC_POP
83+
7484
assert(std::equal(a, a + 5, b, std::equal_to<char>()));
7585
#if TEST_STD_VER >= 14
7686
assert(std::equal(a, a + 5, b, b + 5, std::equal_to<char>()));

libcxx/test/std/algorithms/alg.nonmodifying/alg.find/find.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// ADDITIONAL_COMPILE_FLAGS: -Wno-sign-compare
9+
// ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-sign-compare
10+
// MSVC warning C4389: '==': signed/unsigned mismatch
11+
// ADDITIONAL_COMPILE_FLAGS(cl-style-warnings): /wd4389
1012

1113
// <algorithm>
1214

libcxx/test/std/algorithms/alg.nonmodifying/alg.find/ranges.find.pass.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010

1111
// UNSUPPORTED: c++03, c++11, c++14, c++17
1212

13-
// ADDITIONAL_COMPILE_FLAGS: -Wno-sign-compare
13+
// ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-sign-compare
14+
// MSVC warning C4242: 'argument': conversion from 'const _Ty' to 'ElementT', possible loss of data
15+
// MSVC warning C4244: 'argument': conversion from 'const _Ty' to 'ElementT', possible loss of data
16+
// ADDITIONAL_COMPILE_FLAGS(cl-style-warnings): /wd4242 /wd4244
1417

1518
// template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity>
1619
// requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>

libcxx/test/std/atomics/atomics.types.generic/general.compile.pass.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,15 @@ void test() {
7474

7575
TEST_IGNORE_NODISCARD a.is_lock_free();
7676

77+
TEST_DIAGNOSTIC_PUSH
78+
// MSVC warning C4197: 'volatile std::atomic<operator_hijacker>': top-level volatile in cast is ignored
79+
TEST_MSVC_DIAGNOSTIC_IGNORED(4197)
80+
7781
TEST_IGNORE_NODISCARD T();
7882
TEST_IGNORE_NODISCARD T(v);
7983

84+
TEST_DIAGNOSTIC_POP
85+
8086
TEST_IGNORE_NODISCARD a.load();
8187
TEST_IGNORE_NODISCARD static_cast<typename T::value_type>(a);
8288
a.store(v);

libcxx/test/std/atomics/atomics.types.generic/pointer.compile.pass.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,16 @@ void test() {
9898

9999
a.store(v);
100100
a = v;
101+
102+
TEST_DIAGNOSTIC_PUSH
103+
// MSVC warning C4197: 'volatile std::atomic<operator_hijacker *>': top-level volatile in cast is ignored
104+
TEST_MSVC_DIAGNOSTIC_IGNORED(4197)
105+
101106
TEST_IGNORE_NODISCARD T();
102107
TEST_IGNORE_NODISCARD T(v);
108+
109+
TEST_DIAGNOSTIC_POP
110+
103111
TEST_IGNORE_NODISCARD a.load();
104112
TEST_IGNORE_NODISCARD static_cast<typename T::value_type>(a);
105113
TEST_IGNORE_NODISCARD* a;

libcxx/test/std/concepts/concepts.lang/concept.default.init/default_initializable.compile.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
// We voluntarily use std::default_initializable on types that have redundant
1212
// or ignored cv-qualifiers -- don't warn about it.
13-
// ADDITIONAL_COMPILE_FLAGS: -Wno-ignored-qualifiers
13+
// ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-ignored-qualifiers
1414

1515
// template<class T>
1616
// concept default_initializable = constructible_from<T> &&

libcxx/test/std/containers/associative/map/map.modifiers/insert_range.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
1010
// Some fields in the test case variables are deliberately not explicitly initialized, this silences a warning on GCC.
11-
// ADDITIONAL_COMPILE_FLAGS: -Wno-missing-field-initializers
11+
// ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-missing-field-initializers
1212

1313
// <map>
1414

libcxx/test/std/containers/associative/multimap/multimap.modifiers/insert_range.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
1010
// Some fields in the test case variables are deliberately not explicitly initialized, this silences a warning on GCC.
11-
// ADDITIONAL_COMPILE_FLAGS: -Wno-missing-field-initializers
11+
// ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-missing-field-initializers
1212

1313
// <map>
1414

libcxx/test/std/containers/associative/multiset/insert_range.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
1010
// Some fields in the test case variables are deliberately not explicitly initialized, this silences a warning on GCC.
11-
// ADDITIONAL_COMPILE_FLAGS: -Wno-missing-field-initializers
11+
// ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-missing-field-initializers
1212

1313
// <set>
1414

0 commit comments

Comments
 (0)