Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/jarro2783/cxxopts.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarryd Beck <jarro.2783@gmail.com>2017-09-04 10:55:52 +0300
committerJarryd Beck <jarro.2783@gmail.com>2017-09-04 10:55:52 +0300
commit0b7686949d01f6475cc13ba0693725aefb76fc0c (patch)
treed1668c71f573dc281e385cb9c25bb3a325098806
parent1e51db16b5eba27c9a7a36a74561cfa19e220223 (diff)
Fix compiler warnings for MSVCv1.4.3
Fixes #62. This fixes compiler warnings that are raised by MSVC. In one case the code that was warned about was never executed, but this compiles it out in that case to silence the warning.
-rw-r--r--include/cxxopts.hpp34
1 files changed, 27 insertions, 7 deletions
diff --git a/include/cxxopts.hpp b/include/cxxopts.hpp
index ff17ec4..fe7d8ef 100644
--- a/include/cxxopts.hpp
+++ b/include/cxxopts.hpp
@@ -448,14 +448,14 @@ namespace cxxopts
{
if (negative)
{
- if (u > U(-std::numeric_limits<T>::min()))
+ if (u > static_cast<U>(-std::numeric_limits<T>::min()))
{
throw argument_incorrect_type(text);
}
}
else
{
- if (u > std::numeric_limits<T>::max())
+ if (u > static_cast<U>(std::numeric_limits<T>::max()))
{
throw argument_incorrect_type(text);
}
@@ -479,6 +479,23 @@ namespace cxxopts
}
}
+ template <typename R, typename T>
+ R
+ checked_negate(T&& t, const std::string&, std::true_type)
+ {
+ // if we got to here, then `t` is a positive number that fits into
+ // `R`. So to avoid MSVC C4146, we first cast it to `R`.
+ // See https://github.com/jarro2783/cxxopts/issues/62 for more details.
+ return -static_cast<R>(t);
+ }
+
+ template <typename R, typename T>
+ T
+ checked_negate(T&&, const std::string& text, std::false_type)
+ {
+ throw argument_incorrect_type(text);
+ }
+
template <typename T>
void
integer_parser(const std::string& text, T& value)
@@ -537,11 +554,14 @@ namespace cxxopts
if (negative)
{
- if (!is_signed)
- {
- throw argument_incorrect_type(text);
- }
- value = -result;
+ value = checked_negate<T>(result,
+ text,
+ std::integral_constant<bool, is_signed>());
+ //if (!is_signed)
+ //{
+ // throw argument_incorrect_type(text);
+ //}
+ //value = -result;
}
else
{