diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index 4862de1d49..104436be87 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -84,7 +84,7 @@ void Instance::Bind(NonEmpty& val) this->ParseResults->AddKeywordError(this->Keyword, " empty string not allowed\n"); } - val.assign(std::string(arg)); + val = std::string(arg); return Continue::No; }, ExpectAtLeast{ 1 }); @@ -94,7 +94,7 @@ void Instance::Bind(Maybe& val) { this->Bind( [&val](cm::string_view arg) -> Continue { - static_cast(val) = std::string(arg); + val = std::string(arg); return Continue::No; }, ExpectAtLeast{ 0 }); diff --git a/Source/cmArgumentParserTypes.h b/Source/cmArgumentParserTypes.h index b12cfc0049..bd14f9bd80 100644 --- a/Source/cmArgumentParserTypes.h +++ b/Source/cmArgumentParserTypes.h @@ -17,6 +17,7 @@ template <> struct Maybe : public std::string { using std::string::basic_string; + using std::string::operator=; }; template @@ -26,12 +27,14 @@ template <> struct MaybeEmpty> : public std::vector { using std::vector::vector; + using std::vector::operator=; }; # endif template struct MaybeEmpty> : public std::vector { using std::vector::vector; + using std::vector::operator=; }; template @@ -40,11 +43,13 @@ template struct NonEmpty> : public std::vector { using std::vector::vector; + using std::vector::operator=; }; template <> struct NonEmpty : public std::string { using std::string::basic_string; + using std::string::operator=; }; } // namespace ArgumentParser @@ -57,18 +62,21 @@ template struct Maybe : public T { using T::T; + using T::operator=; }; template struct MaybeEmpty : public T { using T::T; + using T::operator=; }; template struct NonEmpty : public T { using T::T; + using T::operator=; }; } // namespace ArgumentParser diff --git a/Tests/CMakeLib/testArgumentParser.cxx b/Tests/CMakeLib/testArgumentParser.cxx index 95df43e828..2dbff01da3 100644 --- a/Tests/CMakeLib/testArgumentParser.cxx +++ b/Tests/CMakeLib/testArgumentParser.cxx @@ -458,6 +458,25 @@ bool testArgumentParserStaticBool() return verifyResult(result, unparsedArguments); } +bool testArgumentParserTypes() +{ + ArgumentParser::Maybe maybeString; + maybeString = std::string(); + maybeString = ""; + + ArgumentParser::MaybeEmpty> maybeEmptyVecStr; + maybeEmptyVecStr = std::vector{}; + + ArgumentParser::NonEmpty nonEmptyString; + nonEmptyString = std::string("x"); + nonEmptyString = "x"; + + ArgumentParser::NonEmpty> nonEmptyVecStr; + nonEmptyVecStr = std::vector{ "" }; + + return true; +} + } // namespace int testArgumentParser(int /*unused*/, char* /*unused*/[]) @@ -482,5 +501,10 @@ int testArgumentParser(int /*unused*/, char* /*unused*/[]) return -1; } + if (!testArgumentParserTypes()) { + std::cout << "While executing testArgumentParserTypes().\n"; + return -1; + } + return 0; }