mirror of
https://github.com/CLIUtils/CLI11.git
synced 2025-04-30 04:33:53 +00:00
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
This commit is contained in:
parent
acee69a8cc
commit
7b315782e1
@ -13,7 +13,7 @@ install:
|
|||||||
build_script:
|
build_script:
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- ps: cmake .. -DCLI11_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_GENERATOR="Visual Studio 14 2015"
|
- ps: cmake .. -DCLI11_WARNINGS_AS_ERRORS=ON -DCLI11_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_GENERATOR="Visual Studio 14 2015"
|
||||||
- ps: cmake --build .
|
- ps: cmake --build .
|
||||||
- cd ..
|
- cd ..
|
||||||
- conan create . CLIUtils/CLI11
|
- conan create . CLIUtils/CLI11
|
||||||
|
@ -2,7 +2,7 @@ steps:
|
|||||||
|
|
||||||
- task: CMake@1
|
- task: CMake@1
|
||||||
inputs:
|
inputs:
|
||||||
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)
|
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)
|
||||||
displayName: 'Configure'
|
displayName: 'Configure'
|
||||||
|
|
||||||
- script: cmake --build .
|
- script: cmake --build .
|
||||||
|
@ -8,7 +8,7 @@ set -evx
|
|||||||
|
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake .. -DCLI11_SINGLE_FILE=ON -DCLI11_CXX_STD=$STD -DCLI11_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER_LAUNCHER=ccache $@
|
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 $@
|
||||||
cmake --build . -- -j2
|
cmake --build . -- -j2
|
||||||
|
|
||||||
set +evx
|
set +evx
|
||||||
|
@ -11,9 +11,6 @@ else()
|
|||||||
cmake_policy(VERSION 3.14)
|
cmake_policy(VERSION 3.14)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TESTING: remove this later
|
|
||||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
|
|
||||||
|
|
||||||
set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"")
|
set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"")
|
||||||
|
|
||||||
# Read in the line containing the version
|
# Read in the line containing the version
|
||||||
@ -26,6 +23,9 @@ string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}")
|
|||||||
# Add the project
|
# Add the project
|
||||||
project(CLI11 LANGUAGES CXX VERSION ${VERSION_STRING})
|
project(CLI11 LANGUAGES CXX VERSION ${VERSION_STRING})
|
||||||
|
|
||||||
|
# Special target that adds warnings. Is not exported.
|
||||||
|
add_library(CLI11_warnings INTERFACE)
|
||||||
|
|
||||||
# Only if built as the main project
|
# Only if built as the main project
|
||||||
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
||||||
# User settable
|
# User settable
|
||||||
@ -45,11 +45,19 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
|||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)")
|
||||||
|
|
||||||
# Be moderately paranoid with flags
|
# Be moderately paranoid with flags
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions("/W4")
|
target_compile_options(CLI11_warnings INTERFACE "/W4")
|
||||||
|
if(CLI11_WARNINGS_AS_ERRORS)
|
||||||
|
target_compile_options(CLI11_warnings INTERFACE "/WX")
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
add_definitions(-Wall -Wextra -pedantic -Wshadow)
|
target_compile_options(CLI11_warnings INTERFACE -Wall -Wextra -pedantic -Wshadow)
|
||||||
|
if(CLI11_WARNINGS_AS_ERRORS)
|
||||||
|
target_compile_options(CLI11_warnings INTERFACE -Werror)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_VERSION VERSION_GREATER 3.6)
|
if(CMAKE_VERSION VERSION_GREATER 3.6)
|
||||||
|
@ -59,6 +59,13 @@ BUILD_GTEST
|
|||||||
set_target_properties(gtest gtest_main gmock gmock_main
|
set_target_properties(gtest gtest_main gmock gmock_main
|
||||||
PROPERTIES FOLDER "Extern")
|
PROPERTIES FOLDER "Extern")
|
||||||
|
|
||||||
|
foreach(TGT IN ITEMS gtest gtest_main gmock gmock_main)
|
||||||
|
get_property(DIR_LIST TARGET ${TGT} PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
|
foreach(ITEM IN LISTS DIR_LIST)
|
||||||
|
set_property(TARGET ${TGT} APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${ITEM}")
|
||||||
|
endforeach()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
if (MSVC_VERSION GREATER_EQUAL 1900)
|
if (MSVC_VERSION GREATER_EQUAL 1900)
|
||||||
target_compile_definitions(gtest PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING)
|
target_compile_definitions(gtest PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING)
|
||||||
|
@ -19,8 +19,8 @@ if(CLI11_EXAMPLE_JSON)
|
|||||||
if(NOT EXISTS "${CLI11_SOURCE_DIR}/extern/json/single_include/nlohmann/json.hpp")
|
if(NOT EXISTS "${CLI11_SOURCE_DIR}/extern/json/single_include/nlohmann/json.hpp")
|
||||||
message(ERROR "You are missing the json package for CLI11_EXAMPLE_JSON. Please update your submodules (git submodule update --init)")
|
message(ERROR "You are missing the json package for CLI11_EXAMPLE_JSON. Please update your submodules (git submodule update --init)")
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
|
if(CMAKE_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
|
||||||
message(WARNING "The json example requires GCC 4.9+ (requirement on json library)")
|
message(WARNING "The json example requires GCC 4.8+ (requirement on json library)")
|
||||||
endif()
|
endif()
|
||||||
add_cli_exe(json json.cpp)
|
add_cli_exe(json json.cpp)
|
||||||
target_include_directories(json PUBLIC SYSTEM "${CLI11_SOURCE_DIR}/extern/json/single_include")
|
target_include_directories(json PUBLIC SYSTEM "${CLI11_SOURCE_DIR}/extern/json/single_include")
|
||||||
|
2
extern/json
vendored
2
extern/json
vendored
@ -1 +1 @@
|
|||||||
Subproject commit db53bdac1926d1baebcb459b685dcd2e4608c355
|
Subproject commit 1126c9ca74fdea22d2ce3a065ac0fcb5792cbdaf
|
2
extern/sanitizers
vendored
2
extern/sanitizers
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 6947cff3a9c9305eb9c16135dd81da3feb4bf87f
|
Subproject commit 99e159ec9bc8dd362b08d18436bd40ff0648417b
|
@ -1105,8 +1105,11 @@ class App {
|
|||||||
}
|
}
|
||||||
/// Get a pointer to subcommand by index
|
/// Get a pointer to subcommand by index
|
||||||
App *get_subcommand(int index = 0) const {
|
App *get_subcommand(int index = 0) const {
|
||||||
if((index >= 0) && (index < static_cast<int>(subcommands_.size())))
|
if(index >= 0) {
|
||||||
return subcommands_[index].get();
|
auto uindex = static_cast<unsigned>(index);
|
||||||
|
if(uindex < subcommands_.size())
|
||||||
|
return subcommands_[uindex].get();
|
||||||
|
}
|
||||||
throw OptionNotFound(std::to_string(index));
|
throw OptionNotFound(std::to_string(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1130,8 +1133,11 @@ class App {
|
|||||||
|
|
||||||
/// Get an owning pointer to subcommand by index
|
/// Get an owning pointer to subcommand by index
|
||||||
CLI::App_p get_subcommand_ptr(int index = 0) const {
|
CLI::App_p get_subcommand_ptr(int index = 0) const {
|
||||||
if((index >= 0) && (index < static_cast<int>(subcommands_.size())))
|
if(index >= 0) {
|
||||||
return subcommands_[index];
|
auto uindex = static_cast<unsigned>(index);
|
||||||
|
if(uindex < subcommands_.size())
|
||||||
|
return subcommands_[uindex];
|
||||||
|
}
|
||||||
throw OptionNotFound(std::to_string(index));
|
throw OptionNotFound(std::to_string(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1274,13 +1280,13 @@ class App {
|
|||||||
/// This must be called after the options are in but before the rest of the program.
|
/// This must be called after the options are in but before the rest of the program.
|
||||||
void parse(int argc, const char *const *argv) {
|
void parse(int argc, const char *const *argv) {
|
||||||
// If the name is not set, read from command line
|
// If the name is not set, read from command line
|
||||||
if((name_.empty()) || (has_automatic_name_)) {
|
if(name_.empty() || has_automatic_name_) {
|
||||||
has_automatic_name_ = true;
|
has_automatic_name_ = true;
|
||||||
name_ = argv[0];
|
name_ = argv[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> args;
|
std::vector<std::string> args;
|
||||||
args.reserve(argc - 1);
|
args.reserve(static_cast<size_t>(argc - 1));
|
||||||
for(int i = argc - 1; i > 0; i--)
|
for(int i = argc - 1; i > 0; i--)
|
||||||
args.emplace_back(argv[i]);
|
args.emplace_back(argv[i]);
|
||||||
parse(std::move(args));
|
parse(std::move(args));
|
||||||
|
@ -722,7 +722,7 @@ class Option : public OptionBase<Option> {
|
|||||||
} else if(get_items_expected() < 0) {
|
} else if(get_items_expected() < 0) {
|
||||||
// Require that this be a multiple of expected size and at least as many as expected
|
// Require that this be a multiple of expected size and at least as many as expected
|
||||||
if(results_.size() < static_cast<size_t>(-get_items_expected()) ||
|
if(results_.size() < static_cast<size_t>(-get_items_expected()) ||
|
||||||
results_.size() % static_cast<size_t>(std::abs(get_type_size())) != 0)
|
results_.size() % static_cast<size_t>(std::abs(get_type_size())) != 0u)
|
||||||
throw ArgumentMismatch(get_name(), get_items_expected(), results_.size());
|
throw ArgumentMismatch(get_name(), get_items_expected(), results_.size());
|
||||||
}
|
}
|
||||||
local_result = !callback_(results_);
|
local_result = !callback_(results_);
|
||||||
@ -799,7 +799,8 @@ class Option : public OptionBase<Option> {
|
|||||||
if(!((input_value.empty()) || (input_value == emptyString))) {
|
if(!((input_value.empty()) || (input_value == emptyString))) {
|
||||||
auto default_ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
|
auto default_ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
|
||||||
if(default_ind >= 0) {
|
if(default_ind >= 0) {
|
||||||
if(default_flag_values_[default_ind].second != input_value) {
|
// We can static cast this to size_t because it is more than 0 in this block
|
||||||
|
if(default_flag_values_[static_cast<size_t>(default_ind)].second != input_value) {
|
||||||
throw(ArgumentMismatch::FlagOverride(name));
|
throw(ArgumentMismatch::FlagOverride(name));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -811,12 +812,12 @@ class Option : public OptionBase<Option> {
|
|||||||
}
|
}
|
||||||
auto ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
|
auto ind = detail::find_member(name, fnames_, ignore_case_, ignore_underscore_);
|
||||||
if((input_value.empty()) || (input_value == emptyString)) {
|
if((input_value.empty()) || (input_value == emptyString)) {
|
||||||
return (ind < 0) ? trueString : default_flag_values_[ind].second;
|
return (ind < 0) ? trueString : default_flag_values_[static_cast<size_t>(ind)].second;
|
||||||
}
|
}
|
||||||
if(ind < 0) {
|
if(ind < 0) {
|
||||||
return input_value;
|
return input_value;
|
||||||
}
|
}
|
||||||
if(default_flag_values_[ind].second == falseString) {
|
if(default_flag_values_[static_cast<size_t>(ind)].second == falseString) {
|
||||||
try {
|
try {
|
||||||
auto val = detail::to_flag_value(input_value);
|
auto val = detail::to_flag_value(input_value);
|
||||||
return (val == 1) ? falseString : (val == (-1) ? trueString : std::to_string(-val));
|
return (val == 1) ? falseString : (val == (-1) ? trueString : std::to_string(-val));
|
||||||
|
@ -231,11 +231,12 @@ inline bool has_default_flag_values(const std::string &flags) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline void remove_default_flag_values(std::string &flags) {
|
inline void remove_default_flag_values(std::string &flags) {
|
||||||
size_t loc = flags.find_first_of('{');
|
auto loc = flags.find_first_of('{');
|
||||||
while(loc != std::string::npos) {
|
while(loc != std::string::npos) {
|
||||||
auto finish = flags.find_first_of("},", loc + 1);
|
auto finish = flags.find_first_of("},", loc + 1);
|
||||||
if((finish != std::string::npos) && (flags[finish] == '}')) {
|
if((finish != std::string::npos) && (flags[finish] == '}')) {
|
||||||
flags.erase(flags.begin() + loc, flags.begin() + finish + 1);
|
flags.erase(flags.begin() + static_cast<std::ptrdiff_t>(loc),
|
||||||
|
flags.begin() + static_cast<std::ptrdiff_t>(finish) + 1);
|
||||||
}
|
}
|
||||||
loc = flags.find_first_of('{', loc + 1);
|
loc = flags.find_first_of('{', loc + 1);
|
||||||
}
|
}
|
||||||
|
@ -68,9 +68,9 @@ class Timer {
|
|||||||
f();
|
f();
|
||||||
std::chrono::duration<double> elapsed = clock::now() - start_;
|
std::chrono::duration<double> elapsed = clock::now() - start_;
|
||||||
total_time = elapsed.count();
|
total_time = elapsed.count();
|
||||||
} while(n++ < 100 && total_time < target_time);
|
} while(n++ < 100u && total_time < target_time);
|
||||||
|
|
||||||
std::string out = make_time_str(total_time / n) + " for " + std::to_string(n) + " tries";
|
std::string out = make_time_str(total_time / static_cast<double>(n)) + " for " + std::to_string(n) + " tries";
|
||||||
start_ = start;
|
start_ = start;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
@ -79,7 +79,7 @@ class Timer {
|
|||||||
std::string make_time_str() const {
|
std::string make_time_str() const {
|
||||||
time_point stop = clock::now();
|
time_point stop = clock::now();
|
||||||
std::chrono::duration<double> elapsed = stop - start_;
|
std::chrono::duration<double> elapsed = stop - start_;
|
||||||
double time = elapsed.count() / cycles;
|
double time = elapsed.count() / static_cast<double>(cycles);
|
||||||
return make_time_str(time);
|
return make_time_str(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -800,7 +800,7 @@ class AsNumberWithUnit : public Validator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string unit{unit_begin, input.end()};
|
std::string unit{unit_begin, input.end()};
|
||||||
input.resize(std::distance(input.begin(), unit_begin));
|
input.resize(static_cast<size_t>(std::distance(input.begin(), unit_begin)));
|
||||||
detail::trim(input);
|
detail::trim(input);
|
||||||
|
|
||||||
if(opts & UNIT_REQUIRED && unit.empty()) {
|
if(opts & UNIT_REQUIRED && unit.empty()) {
|
||||||
|
@ -55,7 +55,7 @@ foreach(T ${CLI11_TESTS})
|
|||||||
|
|
||||||
add_executable(${T} ${T}.cpp ${CLI11_headers})
|
add_executable(${T} ${T}.cpp ${CLI11_headers})
|
||||||
add_sanitizers(${T})
|
add_sanitizers(${T})
|
||||||
target_link_libraries(${T} PUBLIC CLI11)
|
target_link_libraries(${T} PUBLIC CLI11 CLI11_warnings)
|
||||||
add_gtest(${T})
|
add_gtest(${T})
|
||||||
|
|
||||||
if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
|
if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
|
||||||
@ -84,6 +84,11 @@ if(NOT MSVC)
|
|||||||
if(TARGET DeprecatedTest_Single)
|
if(TARGET DeprecatedTest_Single)
|
||||||
target_compile_options(DeprecatedTest_Single PRIVATE -Wno-deprecated-declarations)
|
target_compile_options(DeprecatedTest_Single PRIVATE -Wno-deprecated-declarations)
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
target_compile_options(DeprecatedTest PRIVATE "/wd4996")
|
||||||
|
if(TARGET DeprecatedTest_Single)
|
||||||
|
target_compile_options(DeprecatedTest_Single PRIVATE "/wd4996")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Link test (build error if inlines missing)
|
# Link test (build error if inlines missing)
|
||||||
|
@ -86,7 +86,7 @@ TEST(StringTools, Modify3) {
|
|||||||
std::string newString = CLI::detail::find_and_modify("baaaaaaaaaa", "aaa", [](std::string &str, size_t index) {
|
std::string newString = CLI::detail::find_and_modify("baaaaaaaaaa", "aaa", [](std::string &str, size_t index) {
|
||||||
str.erase(index, 3);
|
str.erase(index, 3);
|
||||||
str.insert(str.begin(), 'a');
|
str.insert(str.begin(), 'a');
|
||||||
return 0;
|
return 0u;
|
||||||
});
|
});
|
||||||
EXPECT_EQ(newString, "aba");
|
EXPECT_EQ(newString, "aba");
|
||||||
}
|
}
|
||||||
|
@ -612,7 +612,7 @@ TEST_F(TApp, NumberWithUnitIntOverflow) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TApp, NumberWithUnitFloatOverflow) {
|
TEST_F(TApp, NumberWithUnitFloatOverflow) {
|
||||||
std::map<std::string, float> mapping{{"a", 2}, {"b", 1}, {"c", 0}};
|
std::map<std::string, float> mapping{{"a", 2.f}, {"b", 1.f}, {"c", 0.f}};
|
||||||
|
|
||||||
float value;
|
float value;
|
||||||
app.add_option("-n", value)->transform(CLI::AsNumberWithUnit(mapping));
|
app.add_option("-n", value)->transform(CLI::AsNumberWithUnit(mapping));
|
||||||
@ -622,11 +622,11 @@ TEST_F(TApp, NumberWithUnitFloatOverflow) {
|
|||||||
|
|
||||||
args = {"-n", "3e+38 b"};
|
args = {"-n", "3e+38 b"};
|
||||||
run();
|
run();
|
||||||
EXPECT_FLOAT_EQ(value, 3e+38);
|
EXPECT_FLOAT_EQ(value, 3e+38f);
|
||||||
|
|
||||||
args = {"-n", "3e+38 c"};
|
args = {"-n", "3e+38 c"};
|
||||||
run();
|
run();
|
||||||
EXPECT_FLOAT_EQ(value, 0);
|
EXPECT_FLOAT_EQ(value, 0.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TApp, AsSizeValue1000_1024) {
|
TEST_F(TApp, AsSizeValue1000_1024) {
|
||||||
@ -639,7 +639,7 @@ TEST_F(TApp, AsSizeValue1000_1024) {
|
|||||||
|
|
||||||
args = {"-s", "1b"};
|
args = {"-s", "1b"};
|
||||||
run();
|
run();
|
||||||
EXPECT_FLOAT_EQ(value, 1);
|
EXPECT_EQ(value, 1u);
|
||||||
|
|
||||||
uint64_t k_value = 1000u;
|
uint64_t k_value = 1000u;
|
||||||
uint64_t ki_value = 1024u;
|
uint64_t ki_value = 1024u;
|
||||||
@ -745,7 +745,7 @@ TEST_F(TApp, AsSizeValue1024) {
|
|||||||
|
|
||||||
args = {"-s", "1b"};
|
args = {"-s", "1b"};
|
||||||
run();
|
run();
|
||||||
EXPECT_FLOAT_EQ(value, 1);
|
EXPECT_EQ(value, 1u);
|
||||||
|
|
||||||
uint64_t ki_value = 1024u;
|
uint64_t ki_value = 1024u;
|
||||||
args = {"-s", "1k"};
|
args = {"-s", "1k"};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user