Skip to content

Commit 7b31578

Browse files
authored
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
1 parent acee69a commit 7b31578

16 files changed

+69
-41
lines changed

.appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ install:
1313
build_script:
1414
- mkdir build
1515
- 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"
1717
- ps: cmake --build .
1818
- cd ..
1919
- conan create . CLIUtils/CLI11

.ci/azure-build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ steps:
22

33
- task: CMake@1
44
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)
66
displayName: 'Configure'
77

88
- script: cmake --build .

.ci/make_and_test.sh

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

99
mkdir -p build
1010
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 $@
1212
cmake --build . -- -j2
1313

1414
set +evx

CMakeLists.txt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ else()
1111
cmake_policy(VERSION 3.14)
1212
endif()
1313

14-
# TESTING: remove this later
15-
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
16-
1714
set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"")
1815

1916
# Read in the line containing the version
@@ -26,6 +23,9 @@ string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}")
2623
# Add the project
2724
project(CLI11 LANGUAGES CXX VERSION ${VERSION_STRING})
2825

26+
# Special target that adds warnings. Is not exported.
27+
add_library(CLI11_warnings INTERFACE)
28+
2929
# Only if built as the main project
3030
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
3131
# User settable
@@ -45,11 +45,19 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
4545
set(CMAKE_CXX_EXTENSIONS OFF)
4646
set(CMAKE_CXX_STANDARD_REQUIRED ON)
4747

48+
option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)")
49+
4850
# Be moderately paranoid with flags
4951
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()
5156
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()
5361
endif()
5462

5563
if(CMAKE_VERSION VERSION_GREATER 3.6)

cmake/AddGoogletest.cmake

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#
1+
#
22
#
33
# Downloads GTest and provides a helper macro to add tests. Add make check, as well, which
44
# gives output on failed tests without having to set an environment variable.
@@ -25,7 +25,7 @@ endif()
2525
# Target must already exist
2626
macro(add_gtest TESTNAME)
2727
target_link_libraries(${TESTNAME} PUBLIC gtest gmock gtest_main)
28-
28+
2929
if(GOOGLE_TEST_INDIVIDUAL)
3030
if(CMAKE_VERSION VERSION_LESS 3.10)
3131
gtest_add_tests(TARGET ${TESTNAME}
@@ -36,7 +36,7 @@ macro(add_gtest TESTNAME)
3636
gtest_discover_tests(${TESTNAME}
3737
TEST_PREFIX "${TESTNAME}."
3838
PROPERTIES FOLDER "Tests")
39-
39+
4040
endif()
4141
else()
4242
add_test(${TESTNAME} ${TESTNAME})
@@ -59,6 +59,13 @@ BUILD_GTEST
5959
set_target_properties(gtest gtest_main gmock gmock_main
6060
PROPERTIES FOLDER "Extern")
6161

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+
6269
if(MSVC)
6370
if (MSVC_VERSION GREATER_EQUAL 1900)
6471
target_compile_definitions(gtest PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING)

examples/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ if(CLI11_EXAMPLE_JSON)
1919
if(NOT EXISTS "${CLI11_SOURCE_DIR}/extern/json/single_include/nlohmann/json.hpp")
2020
message(ERROR "You are missing the json package for CLI11_EXAMPLE_JSON. Please update your submodules (git submodule update --init)")
2121
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)")
2424
endif()
2525
add_cli_exe(json json.cpp)
2626
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
6969
"This is a timer:"
7070
"--file is required"
7171
"Run with --help for more information.")
72-
72+
7373
add_test(NAME subcom_partitioned_all COMMAND subcom_partitioned --file this --count --count -d 1.2)
7474
set_property(TEST subcom_partitioned_all PROPERTY PASS_REGULAR_EXPRESSION
7575
"This is a timer:"
@@ -93,7 +93,7 @@ set_property(TEST option_groups_extra PROPERTY PASS_REGULAR_EXPRESSION
9393
add_test(NAME option_groups_extra2 COMMAND option_groups --csv --address "192.168.1.1" -o "test.out")
9494
set_property(TEST option_groups_extra2 PROPERTY PASS_REGULAR_EXPRESSION
9595
"at most 1")
96-
96+
9797
add_cli_exe(positional_arity positional_arity.cpp)
9898
add_test(NAME positional_arity1 COMMAND positional_arity one )
9999
set_property(TEST positional_arity1 PROPERTY PASS_REGULAR_EXPRESSION
@@ -132,7 +132,7 @@ set_property(TEST shapes_all PROPERTY PASS_REGULAR_EXPRESSION
132132
"circle4"
133133
"rectangle2 with edges [2.1,2.1]"
134134
"triangel1 with sides [4.5]")
135-
135+
136136
add_cli_exe(ranges ranges.cpp)
137137
add_test(NAME ranges_range COMMAND ranges --range 1 2 3)
138138
set_property(TEST ranges_range PROPERTY PASS_REGULAR_EXPRESSION

extern/json

Submodule json updated 201 files

include/CLI/App.hpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,8 +1105,11 @@ class App {
11051105
}
11061106
/// Get a pointer to subcommand by index
11071107
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+
}
11101113
throw OptionNotFound(std::to_string(index));
11111114
}
11121115

@@ -1130,8 +1133,11 @@ class App {
11301133

11311134
/// Get an owning pointer to subcommand by index
11321135
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+
}
11351141
throw OptionNotFound(std::to_string(index));
11361142
}
11371143

@@ -1274,13 +1280,13 @@ class App {
12741280
/// This must be called after the options are in but before the rest of the program.
12751281
void parse(int argc, const char *const *argv) {
12761282
// If the name is not set, read from command line
1277-
if((name_.empty()) || (has_automatic_name_)) {
1283+
if(name_.empty() || has_automatic_name_) {
12781284
has_automatic_name_ = true;
12791285
name_ = argv[0];
12801286
}
12811287

12821288
std::vector<std::string> args;
1283-
args.reserve(argc - 1);
1289+
args.reserve(static_cast<size_t>(argc - 1));
12841290
for(int i = argc - 1; i > 0; i--)
12851291
args.emplace_back(argv[i]);
12861292
parse(std::move(args));

include/CLI/Option.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ class Option : public OptionBase<Option> {
722722
} else if(get_items_expected() < 0) {
723723
// Require that this be a multiple of expected size and at least as many as expected
724724
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)
726726
throw ArgumentMismatch(get_name(), get_items_expected(), results_.size());
727727
}
728728
local_result = !callback_(results_);
@@ -799,7 +799,8 @@ class Option : public OptionBase<Option> {
799799
if(!((input_value.empty()) || (input_value == emptyString))) {
800800
auto default_ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
801801
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) {
803804
throw(ArgumentMismatch::FlagOverride(name));
804805
}
805806
} else {
@@ -811,12 +812,12 @@ class Option : public OptionBase<Option> {
811812
}
812813
auto ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
813814
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;
815816
}
816817
if(ind < 0) {
817818
return input_value;
818819
}
819-
if(default_flag_values_[ind].second == falseString) {
820+
if(default_flag_values_[static_cast<size_t>(ind)].second == falseString) {
820821
try {
821822
auto val = detail::to_flag_value(input_value);
822823
return (val == 1) ? falseString : (val == (-1) ? trueString : std::to_string(-val));

0 commit comments

Comments
 (0)