Commit 7b315782e1eede605325c94a280cfd1272d438d4

Authored by Henry Schreiner
Committed by GitHub
1 parent acee69a8

Warnings (#281)

* Fixing some warnings

* Make gtest a system library

* Fixing format

* Adding better method for adding warnings

* Nicer Windows deprecated test

* JSON update and drop testing timer

* Warnings as errors everywhere
.appveyor.yml
@@ -13,7 +13,7 @@ install: @@ -13,7 +13,7 @@ install:
13 build_script: 13 build_script:
14 - mkdir build 14 - mkdir build
15 - cd build 15 - cd build
16 - - ps: cmake .. -DCLI11_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_GENERATOR="Visual Studio 14 2015" 16 + - ps: cmake .. -DCLI11_WARNINGS_AS_ERRORS=ON -DCLI11_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_GENERATOR="Visual Studio 14 2015"
17 - ps: cmake --build . 17 - ps: cmake --build .
18 - cd .. 18 - cd ..
19 - conan create . CLIUtils/CLI11 19 - conan create . CLIUtils/CLI11
.ci/azure-build.yml
@@ -2,7 +2,7 @@ steps: @@ -2,7 +2,7 @@ steps:
2 2
3 - task: CMake@1 3 - task: CMake@1
4 inputs: 4 inputs:
5 - cmakeArgs: .. -DCLI11_SINGLE_FILE=$(cli11.single) -DCLI11_CXX_STD=$(cli11.std) -DCLI11_SINGLE_FILE_TESTS=$(cli11.single) -DCMAKE_BUILD_TYPE=$(cli11.build_type) $(cli11.options) 5 + cmakeArgs: .. -DCLI11_WARNINGS_AS_ERRORS=ON -DCLI11_SINGLE_FILE=$(cli11.single) -DCLI11_CXX_STD=$(cli11.std) -DCLI11_SINGLE_FILE_TESTS=$(cli11.single) -DCMAKE_BUILD_TYPE=$(cli11.build_type) $(cli11.options)
6 displayName: 'Configure' 6 displayName: 'Configure'
7 7
8 - script: cmake --build . 8 - script: cmake --build .
.ci/make_and_test.sh
@@ -8,7 +8,7 @@ set -evx @@ -8,7 +8,7 @@ set -evx
8 8
9 mkdir -p build 9 mkdir -p build
10 cd build 10 cd build
11 -cmake .. -DCLI11_SINGLE_FILE=ON -DCLI11_CXX_STD=$STD -DCLI11_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER_LAUNCHER=ccache $@ 11 +cmake .. -DCLI11_WARNINGS_AS_ERRORS=ON -DCLI11_SINGLE_FILE=ON -DCLI11_CXX_STD=$STD -DCLI11_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER_LAUNCHER=ccache $@
12 cmake --build . -- -j2 12 cmake --build . -- -j2
13 13
14 set +evx 14 set +evx
CMakeLists.txt
@@ -11,9 +11,6 @@ else() @@ -11,9 +11,6 @@ else()
11 cmake_policy(VERSION 3.14) 11 cmake_policy(VERSION 3.14)
12 endif() 12 endif()
13 13
14 -# TESTING: remove this later  
15 -set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")  
16 -  
17 set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"") 14 set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"")
18 15
19 # Read in the line containing the version 16 # Read in the line containing the version
@@ -26,6 +23,9 @@ string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}") @@ -26,6 +23,9 @@ string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}")
26 # Add the project 23 # Add the project
27 project(CLI11 LANGUAGES CXX VERSION ${VERSION_STRING}) 24 project(CLI11 LANGUAGES CXX VERSION ${VERSION_STRING})
28 25
  26 +# Special target that adds warnings. Is not exported.
  27 +add_library(CLI11_warnings INTERFACE)
  28 +
29 # Only if built as the main project 29 # Only if built as the main project
30 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) 30 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
31 # User settable 31 # User settable
@@ -45,11 +45,19 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) @@ -45,11 +45,19 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
45 set(CMAKE_CXX_EXTENSIONS OFF) 45 set(CMAKE_CXX_EXTENSIONS OFF)
46 set(CMAKE_CXX_STANDARD_REQUIRED ON) 46 set(CMAKE_CXX_STANDARD_REQUIRED ON)
47 47
  48 + option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)")
  49 +
48 # Be moderately paranoid with flags 50 # Be moderately paranoid with flags
49 if(MSVC) 51 if(MSVC)
50 - add_definitions("/W4") 52 + target_compile_options(CLI11_warnings INTERFACE "/W4")
  53 + if(CLI11_WARNINGS_AS_ERRORS)
  54 + target_compile_options(CLI11_warnings INTERFACE "/WX")
  55 + endif()
51 else() 56 else()
52 - add_definitions(-Wall -Wextra -pedantic -Wshadow) 57 + target_compile_options(CLI11_warnings INTERFACE -Wall -Wextra -pedantic -Wshadow)
  58 + if(CLI11_WARNINGS_AS_ERRORS)
  59 + target_compile_options(CLI11_warnings INTERFACE -Werror)
  60 + endif()
53 endif() 61 endif()
54 62
55 if(CMAKE_VERSION VERSION_GREATER 3.6) 63 if(CMAKE_VERSION VERSION_GREATER 3.6)
cmake/AddGoogletest.cmake
1 -# 1 +#
2 # 2 #
3 # Downloads GTest and provides a helper macro to add tests. Add make check, as well, which 3 # Downloads GTest and provides a helper macro to add tests. Add make check, as well, which
4 # gives output on failed tests without having to set an environment variable. 4 # gives output on failed tests without having to set an environment variable.
@@ -25,7 +25,7 @@ endif() @@ -25,7 +25,7 @@ endif()
25 # Target must already exist 25 # Target must already exist
26 macro(add_gtest TESTNAME) 26 macro(add_gtest TESTNAME)
27 target_link_libraries(${TESTNAME} PUBLIC gtest gmock gtest_main) 27 target_link_libraries(${TESTNAME} PUBLIC gtest gmock gtest_main)
28 - 28 +
29 if(GOOGLE_TEST_INDIVIDUAL) 29 if(GOOGLE_TEST_INDIVIDUAL)
30 if(CMAKE_VERSION VERSION_LESS 3.10) 30 if(CMAKE_VERSION VERSION_LESS 3.10)
31 gtest_add_tests(TARGET ${TESTNAME} 31 gtest_add_tests(TARGET ${TESTNAME}
@@ -36,7 +36,7 @@ macro(add_gtest TESTNAME) @@ -36,7 +36,7 @@ macro(add_gtest TESTNAME)
36 gtest_discover_tests(${TESTNAME} 36 gtest_discover_tests(${TESTNAME}
37 TEST_PREFIX "${TESTNAME}." 37 TEST_PREFIX "${TESTNAME}."
38 PROPERTIES FOLDER "Tests") 38 PROPERTIES FOLDER "Tests")
39 - 39 +
40 endif() 40 endif()
41 else() 41 else()
42 add_test(${TESTNAME} ${TESTNAME}) 42 add_test(${TESTNAME} ${TESTNAME})
@@ -59,6 +59,13 @@ BUILD_GTEST @@ -59,6 +59,13 @@ BUILD_GTEST
59 set_target_properties(gtest gtest_main gmock gmock_main 59 set_target_properties(gtest gtest_main gmock gmock_main
60 PROPERTIES FOLDER "Extern") 60 PROPERTIES FOLDER "Extern")
61 61
  62 +foreach(TGT IN ITEMS gtest gtest_main gmock gmock_main)
  63 + get_property(DIR_LIST TARGET ${TGT} PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
  64 + foreach(ITEM IN LISTS DIR_LIST)
  65 + set_property(TARGET ${TGT} APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${ITEM}")
  66 + endforeach()
  67 +endforeach()
  68 +
62 if(MSVC) 69 if(MSVC)
63 if (MSVC_VERSION GREATER_EQUAL 1900) 70 if (MSVC_VERSION GREATER_EQUAL 1900)
64 target_compile_definitions(gtest PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING) 71 target_compile_definitions(gtest PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING)
examples/CMakeLists.txt
@@ -19,8 +19,8 @@ if(CLI11_EXAMPLE_JSON) @@ -19,8 +19,8 @@ if(CLI11_EXAMPLE_JSON)
19 if(NOT EXISTS "${CLI11_SOURCE_DIR}/extern/json/single_include/nlohmann/json.hpp") 19 if(NOT EXISTS "${CLI11_SOURCE_DIR}/extern/json/single_include/nlohmann/json.hpp")
20 message(ERROR "You are missing the json package for CLI11_EXAMPLE_JSON. Please update your submodules (git submodule update --init)") 20 message(ERROR "You are missing the json package for CLI11_EXAMPLE_JSON. Please update your submodules (git submodule update --init)")
21 endif() 21 endif()
22 - if(CMAKE_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)  
23 - message(WARNING "The json example requires GCC 4.9+ (requirement on json library)") 22 + if(CMAKE_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
  23 + message(WARNING "The json example requires GCC 4.8+ (requirement on json library)")
24 endif() 24 endif()
25 add_cli_exe(json json.cpp) 25 add_cli_exe(json json.cpp)
26 target_include_directories(json PUBLIC SYSTEM "${CLI11_SOURCE_DIR}/extern/json/single_include") 26 target_include_directories(json PUBLIC SYSTEM "${CLI11_SOURCE_DIR}/extern/json/single_include")
@@ -69,7 +69,7 @@ set_property(TEST subcom_partitioned_none PROPERTY PASS_REGULAR_EXPRESSION @@ -69,7 +69,7 @@ set_property(TEST subcom_partitioned_none PROPERTY PASS_REGULAR_EXPRESSION
69 "This is a timer:" 69 "This is a timer:"
70 "--file is required" 70 "--file is required"
71 "Run with --help for more information.") 71 "Run with --help for more information.")
72 - 72 +
73 add_test(NAME subcom_partitioned_all COMMAND subcom_partitioned --file this --count --count -d 1.2) 73 add_test(NAME subcom_partitioned_all COMMAND subcom_partitioned --file this --count --count -d 1.2)
74 set_property(TEST subcom_partitioned_all PROPERTY PASS_REGULAR_EXPRESSION 74 set_property(TEST subcom_partitioned_all PROPERTY PASS_REGULAR_EXPRESSION
75 "This is a timer:" 75 "This is a timer:"
@@ -93,7 +93,7 @@ set_property(TEST option_groups_extra PROPERTY PASS_REGULAR_EXPRESSION @@ -93,7 +93,7 @@ set_property(TEST option_groups_extra PROPERTY PASS_REGULAR_EXPRESSION
93 add_test(NAME option_groups_extra2 COMMAND option_groups --csv --address "192.168.1.1" -o "test.out") 93 add_test(NAME option_groups_extra2 COMMAND option_groups --csv --address "192.168.1.1" -o "test.out")
94 set_property(TEST option_groups_extra2 PROPERTY PASS_REGULAR_EXPRESSION 94 set_property(TEST option_groups_extra2 PROPERTY PASS_REGULAR_EXPRESSION
95 "at most 1") 95 "at most 1")
96 - 96 +
97 add_cli_exe(positional_arity positional_arity.cpp) 97 add_cli_exe(positional_arity positional_arity.cpp)
98 add_test(NAME positional_arity1 COMMAND positional_arity one ) 98 add_test(NAME positional_arity1 COMMAND positional_arity one )
99 set_property(TEST positional_arity1 PROPERTY PASS_REGULAR_EXPRESSION 99 set_property(TEST positional_arity1 PROPERTY PASS_REGULAR_EXPRESSION
@@ -132,7 +132,7 @@ set_property(TEST shapes_all PROPERTY PASS_REGULAR_EXPRESSION @@ -132,7 +132,7 @@ set_property(TEST shapes_all PROPERTY PASS_REGULAR_EXPRESSION
132 "circle4" 132 "circle4"
133 "rectangle2 with edges [2.1,2.1]" 133 "rectangle2 with edges [2.1,2.1]"
134 "triangel1 with sides [4.5]") 134 "triangel1 with sides [4.5]")
135 - 135 +
136 add_cli_exe(ranges ranges.cpp) 136 add_cli_exe(ranges ranges.cpp)
137 add_test(NAME ranges_range COMMAND ranges --range 1 2 3) 137 add_test(NAME ranges_range COMMAND ranges --range 1 2 3)
138 set_property(TEST ranges_range PROPERTY PASS_REGULAR_EXPRESSION 138 set_property(TEST ranges_range PROPERTY PASS_REGULAR_EXPRESSION
1 -Subproject commit db53bdac1926d1baebcb459b685dcd2e4608c355 1 +Subproject commit 1126c9ca74fdea22d2ce3a065ac0fcb5792cbdaf
sanitizers @ 99e159ec9bc
1 -Subproject commit 6947cff3a9c9305eb9c16135dd81da3feb4bf87f 1 +Subproject commit 99e159ec9bc8dd362b08d18436bd40ff0648417b
include/CLI/App.hpp
@@ -1105,8 +1105,11 @@ class App { @@ -1105,8 +1105,11 @@ class App {
1105 } 1105 }
1106 /// Get a pointer to subcommand by index 1106 /// Get a pointer to subcommand by index
1107 App *get_subcommand(int index = 0) const { 1107 App *get_subcommand(int index = 0) const {
1108 - if((index >= 0) && (index < static_cast<int>(subcommands_.size())))  
1109 - return subcommands_[index].get(); 1108 + if(index >= 0) {
  1109 + auto uindex = static_cast<unsigned>(index);
  1110 + if(uindex < subcommands_.size())
  1111 + return subcommands_[uindex].get();
  1112 + }
1110 throw OptionNotFound(std::to_string(index)); 1113 throw OptionNotFound(std::to_string(index));
1111 } 1114 }
1112 1115
@@ -1130,8 +1133,11 @@ class App { @@ -1130,8 +1133,11 @@ class App {
1130 1133
1131 /// Get an owning pointer to subcommand by index 1134 /// Get an owning pointer to subcommand by index
1132 CLI::App_p get_subcommand_ptr(int index = 0) const { 1135 CLI::App_p get_subcommand_ptr(int index = 0) const {
1133 - if((index >= 0) && (index < static_cast<int>(subcommands_.size())))  
1134 - return subcommands_[index]; 1136 + if(index >= 0) {
  1137 + auto uindex = static_cast<unsigned>(index);
  1138 + if(uindex < subcommands_.size())
  1139 + return subcommands_[uindex];
  1140 + }
1135 throw OptionNotFound(std::to_string(index)); 1141 throw OptionNotFound(std::to_string(index));
1136 } 1142 }
1137 1143
@@ -1274,13 +1280,13 @@ class App { @@ -1274,13 +1280,13 @@ class App {
1274 /// This must be called after the options are in but before the rest of the program. 1280 /// This must be called after the options are in but before the rest of the program.
1275 void parse(int argc, const char *const *argv) { 1281 void parse(int argc, const char *const *argv) {
1276 // If the name is not set, read from command line 1282 // If the name is not set, read from command line
1277 - if((name_.empty()) || (has_automatic_name_)) { 1283 + if(name_.empty() || has_automatic_name_) {
1278 has_automatic_name_ = true; 1284 has_automatic_name_ = true;
1279 name_ = argv[0]; 1285 name_ = argv[0];
1280 } 1286 }
1281 1287
1282 std::vector<std::string> args; 1288 std::vector<std::string> args;
1283 - args.reserve(argc - 1); 1289 + args.reserve(static_cast<size_t>(argc - 1));
1284 for(int i = argc - 1; i > 0; i--) 1290 for(int i = argc - 1; i > 0; i--)
1285 args.emplace_back(argv[i]); 1291 args.emplace_back(argv[i]);
1286 parse(std::move(args)); 1292 parse(std::move(args));
include/CLI/Option.hpp
@@ -722,7 +722,7 @@ class Option : public OptionBase&lt;Option&gt; { @@ -722,7 +722,7 @@ class Option : public OptionBase&lt;Option&gt; {
722 } else if(get_items_expected() < 0) { 722 } else if(get_items_expected() < 0) {
723 // Require that this be a multiple of expected size and at least as many as expected 723 // Require that this be a multiple of expected size and at least as many as expected
724 if(results_.size() < static_cast<size_t>(-get_items_expected()) || 724 if(results_.size() < static_cast<size_t>(-get_items_expected()) ||
725 - results_.size() % static_cast<size_t>(std::abs(get_type_size())) != 0) 725 + results_.size() % static_cast<size_t>(std::abs(get_type_size())) != 0u)
726 throw ArgumentMismatch(get_name(), get_items_expected(), results_.size()); 726 throw ArgumentMismatch(get_name(), get_items_expected(), results_.size());
727 } 727 }
728 local_result = !callback_(results_); 728 local_result = !callback_(results_);
@@ -799,7 +799,8 @@ class Option : public OptionBase&lt;Option&gt; { @@ -799,7 +799,8 @@ class Option : public OptionBase&lt;Option&gt; {
799 if(!((input_value.empty()) || (input_value == emptyString))) { 799 if(!((input_value.empty()) || (input_value == emptyString))) {
800 auto default_ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_); 800 auto default_ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
801 if(default_ind >= 0) { 801 if(default_ind >= 0) {
802 - if(default_flag_values_[default_ind].second != input_value) { 802 + // We can static cast this to size_t because it is more than 0 in this block
  803 + if(default_flag_values_[static_cast<size_t>(default_ind)].second != input_value) {
803 throw(ArgumentMismatch::FlagOverride(name)); 804 throw(ArgumentMismatch::FlagOverride(name));
804 } 805 }
805 } else { 806 } else {
@@ -811,12 +812,12 @@ class Option : public OptionBase&lt;Option&gt; { @@ -811,12 +812,12 @@ class Option : public OptionBase&lt;Option&gt; {
811 } 812 }
812 auto ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_); 813 auto ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
813 if((input_value.empty()) || (input_value == emptyString)) { 814 if((input_value.empty()) || (input_value == emptyString)) {
814 - return (ind < 0) ? trueString : default_flag_values_[ind].second; 815 + return (ind < 0) ? trueString : default_flag_values_[static_cast<size_t>(ind)].second;
815 } 816 }
816 if(ind < 0) { 817 if(ind < 0) {
817 return input_value; 818 return input_value;
818 } 819 }
819 - if(default_flag_values_[ind].second == falseString) { 820 + if(default_flag_values_[static_cast<size_t>(ind)].second == falseString) {
820 try { 821 try {
821 auto val = detail::to_flag_value(input_value); 822 auto val = detail::to_flag_value(input_value);
822 return (val == 1) ? falseString : (val == (-1) ? trueString : std::to_string(-val)); 823 return (val == 1) ? falseString : (val == (-1) ? trueString : std::to_string(-val));
include/CLI/StringTools.hpp
@@ -231,11 +231,12 @@ inline bool has_default_flag_values(const std::string &amp;flags) { @@ -231,11 +231,12 @@ inline bool has_default_flag_values(const std::string &amp;flags) {
231 } 231 }
232 232
233 inline void remove_default_flag_values(std::string &flags) { 233 inline void remove_default_flag_values(std::string &flags) {
234 - size_t loc = flags.find_first_of('{'); 234 + auto loc = flags.find_first_of('{');
235 while(loc != std::string::npos) { 235 while(loc != std::string::npos) {
236 auto finish = flags.find_first_of("},", loc + 1); 236 auto finish = flags.find_first_of("},", loc + 1);
237 if((finish != std::string::npos) && (flags[finish] == '}')) { 237 if((finish != std::string::npos) && (flags[finish] == '}')) {
238 - flags.erase(flags.begin() + loc, flags.begin() + finish + 1); 238 + flags.erase(flags.begin() + static_cast<std::ptrdiff_t>(loc),
  239 + flags.begin() + static_cast<std::ptrdiff_t>(finish) + 1);
239 } 240 }
240 loc = flags.find_first_of('{', loc + 1); 241 loc = flags.find_first_of('{', loc + 1);
241 } 242 }
include/CLI/Timer.hpp
@@ -68,9 +68,9 @@ class Timer { @@ -68,9 +68,9 @@ class Timer {
68 f(); 68 f();
69 std::chrono::duration<double> elapsed = clock::now() - start_; 69 std::chrono::duration<double> elapsed = clock::now() - start_;
70 total_time = elapsed.count(); 70 total_time = elapsed.count();
71 - } while(n++ < 100 && total_time < target_time); 71 + } while(n++ < 100u && total_time < target_time);
72 72
73 - std::string out = make_time_str(total_time / n) + " for " + std::to_string(n) + " tries"; 73 + std::string out = make_time_str(total_time / static_cast<double>(n)) + " for " + std::to_string(n) + " tries";
74 start_ = start; 74 start_ = start;
75 return out; 75 return out;
76 } 76 }
@@ -79,7 +79,7 @@ class Timer { @@ -79,7 +79,7 @@ class Timer {
79 std::string make_time_str() const { 79 std::string make_time_str() const {
80 time_point stop = clock::now(); 80 time_point stop = clock::now();
81 std::chrono::duration<double> elapsed = stop - start_; 81 std::chrono::duration<double> elapsed = stop - start_;
82 - double time = elapsed.count() / cycles; 82 + double time = elapsed.count() / static_cast<double>(cycles);
83 return make_time_str(time); 83 return make_time_str(time);
84 } 84 }
85 85
include/CLI/Validators.hpp
@@ -800,7 +800,7 @@ class AsNumberWithUnit : public Validator { @@ -800,7 +800,7 @@ class AsNumberWithUnit : public Validator {
800 } 800 }
801 801
802 std::string unit{unit_begin, input.end()}; 802 std::string unit{unit_begin, input.end()};
803 - input.resize(std::distance(input.begin(), unit_begin)); 803 + input.resize(static_cast<size_t>(std::distance(input.begin(), unit_begin)));
804 detail::trim(input); 804 detail::trim(input);
805 805
806 if(opts & UNIT_REQUIRED && unit.empty()) { 806 if(opts & UNIT_REQUIRED && unit.empty()) {
tests/CMakeLists.txt
@@ -55,7 +55,7 @@ foreach(T ${CLI11_TESTS}) @@ -55,7 +55,7 @@ foreach(T ${CLI11_TESTS})
55 55
56 add_executable(${T} ${T}.cpp ${CLI11_headers}) 56 add_executable(${T} ${T}.cpp ${CLI11_headers})
57 add_sanitizers(${T}) 57 add_sanitizers(${T})
58 - target_link_libraries(${T} PUBLIC CLI11) 58 + target_link_libraries(${T} PUBLIC CLI11 CLI11_warnings)
59 add_gtest(${T}) 59 add_gtest(${T})
60 60
61 if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS) 61 if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
@@ -84,6 +84,11 @@ if(NOT MSVC) @@ -84,6 +84,11 @@ if(NOT MSVC)
84 if(TARGET DeprecatedTest_Single) 84 if(TARGET DeprecatedTest_Single)
85 target_compile_options(DeprecatedTest_Single PRIVATE -Wno-deprecated-declarations) 85 target_compile_options(DeprecatedTest_Single PRIVATE -Wno-deprecated-declarations)
86 endif() 86 endif()
  87 +else()
  88 + target_compile_options(DeprecatedTest PRIVATE "/wd4996")
  89 + if(TARGET DeprecatedTest_Single)
  90 + target_compile_options(DeprecatedTest_Single PRIVATE "/wd4996")
  91 + endif()
87 endif() 92 endif()
88 93
89 # Link test (build error if inlines missing) 94 # Link test (build error if inlines missing)
tests/HelpersTest.cpp
@@ -86,7 +86,7 @@ TEST(StringTools, Modify3) { @@ -86,7 +86,7 @@ TEST(StringTools, Modify3) {
86 std::string newString = CLI::detail::find_and_modify("baaaaaaaaaa", "aaa", [](std::string &str, size_t index) { 86 std::string newString = CLI::detail::find_and_modify("baaaaaaaaaa", "aaa", [](std::string &str, size_t index) {
87 str.erase(index, 3); 87 str.erase(index, 3);
88 str.insert(str.begin(), 'a'); 88 str.insert(str.begin(), 'a');
89 - return 0; 89 + return 0u;
90 }); 90 });
91 EXPECT_EQ(newString, "aba"); 91 EXPECT_EQ(newString, "aba");
92 } 92 }
tests/TransformTest.cpp
@@ -612,7 +612,7 @@ TEST_F(TApp, NumberWithUnitIntOverflow) { @@ -612,7 +612,7 @@ TEST_F(TApp, NumberWithUnitIntOverflow) {
612 } 612 }
613 613
614 TEST_F(TApp, NumberWithUnitFloatOverflow) { 614 TEST_F(TApp, NumberWithUnitFloatOverflow) {
615 - std::map<std::string, float> mapping{{"a", 2}, {"b", 1}, {"c", 0}}; 615 + std::map<std::string, float> mapping{{"a", 2.f}, {"b", 1.f}, {"c", 0.f}};
616 616
617 float value; 617 float value;
618 app.add_option("-n", value)->transform(CLI::AsNumberWithUnit(mapping)); 618 app.add_option("-n", value)->transform(CLI::AsNumberWithUnit(mapping));
@@ -622,11 +622,11 @@ TEST_F(TApp, NumberWithUnitFloatOverflow) { @@ -622,11 +622,11 @@ TEST_F(TApp, NumberWithUnitFloatOverflow) {
622 622
623 args = {"-n", "3e+38 b"}; 623 args = {"-n", "3e+38 b"};
624 run(); 624 run();
625 - EXPECT_FLOAT_EQ(value, 3e+38); 625 + EXPECT_FLOAT_EQ(value, 3e+38f);
626 626
627 args = {"-n", "3e+38 c"}; 627 args = {"-n", "3e+38 c"};
628 run(); 628 run();
629 - EXPECT_FLOAT_EQ(value, 0); 629 + EXPECT_FLOAT_EQ(value, 0.f);
630 } 630 }
631 631
632 TEST_F(TApp, AsSizeValue1000_1024) { 632 TEST_F(TApp, AsSizeValue1000_1024) {
@@ -639,7 +639,7 @@ TEST_F(TApp, AsSizeValue1000_1024) { @@ -639,7 +639,7 @@ TEST_F(TApp, AsSizeValue1000_1024) {
639 639
640 args = {"-s", "1b"}; 640 args = {"-s", "1b"};
641 run(); 641 run();
642 - EXPECT_FLOAT_EQ(value, 1); 642 + EXPECT_EQ(value, 1u);
643 643
644 uint64_t k_value = 1000u; 644 uint64_t k_value = 1000u;
645 uint64_t ki_value = 1024u; 645 uint64_t ki_value = 1024u;
@@ -745,7 +745,7 @@ TEST_F(TApp, AsSizeValue1024) { @@ -745,7 +745,7 @@ TEST_F(TApp, AsSizeValue1024) {
745 745
746 args = {"-s", "1b"}; 746 args = {"-s", "1b"};
747 run(); 747 run();
748 - EXPECT_FLOAT_EQ(value, 1); 748 + EXPECT_EQ(value, 1u);
749 749
750 uint64_t ki_value = 1024u; 750 uint64_t ki_value = 1024u;
751 args = {"-s", "1k"}; 751 args = {"-s", "1k"};