diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index 30a3d9a4713..943d2df3770 100644 --- a/include/llvm/Support/CommandLine.h +++ b/include/llvm/Support/CommandLine.h @@ -205,9 +205,9 @@ class Option { unsigned AdditionalVals; // Greater than 0 for multi-valued option. public: - const char *ArgStr; // The argument string itself (ex: "help", "o") - const char *HelpStr; // The descriptive text message for -help - const char *ValueStr; // String describing what the value of this option is + StringRef ArgStr; // The argument string itself (ex: "help", "o") + StringRef HelpStr; // The descriptive text message for -help + StringRef ValueStr; // String describing what the value of this option is OptionCategory *Category; // The Category this option belongs to bool FullyInitialized; // Has addArguemnt been called? @@ -228,14 +228,14 @@ public: inline unsigned getNumAdditionalVals() const { return AdditionalVals; } // hasArgStr - Return true if the argstr != "" - bool hasArgStr() const { return ArgStr[0] != 0; } + bool hasArgStr() const { return !ArgStr.empty(); } //-------------------------------------------------------------------------=== // Accessor functions set by OptionModifiers // - void setArgStr(const char *S); - void setDescription(const char *S) { HelpStr = S; } - void setValueStr(const char *S) { ValueStr = S; } + void setArgStr(StringRef S); + void setDescription(StringRef S) { HelpStr = S; } + void setValueStr(StringRef S) { ValueStr = S; } void setNumOccurrencesFlag(enum NumOccurrencesFlag Val) { Occurrences = Val; } void setValueExpectedFlag(enum ValueExpected Val) { Value = Val; } void setHiddenFlag(enum OptionHidden Val) { HiddenFlag = Val; } @@ -275,7 +275,7 @@ public: virtual void printOptionValue(size_t GlobalWidth, bool Force) const = 0; - virtual void getExtraOptionNames(SmallVectorImpl &) {} + virtual void getExtraOptionNames(SmallVectorImpl &) {} // addOccurrence - Wrapper around handleOccurrence that enforces Flags. // @@ -605,7 +605,7 @@ public: void initialize() {} - void getExtraOptionNames(SmallVectorImpl &OptionNames) { + void getExtraOptionNames(SmallVectorImpl &OptionNames) { // If there has been no argstr specified, that means that we need to add an // argument for every possible option. This ensures that our options are // vectored to us. @@ -721,7 +721,7 @@ public: return ValueRequired; } - void getExtraOptionNames(SmallVectorImpl &) {} + void getExtraOptionNames(SmallVectorImpl &) {} void initialize() {} @@ -1205,8 +1205,7 @@ class opt : public Option, enum ValueExpected getValueExpectedFlagDefault() const override { return Parser.getValueExpectedFlagDefault(); } - void - getExtraOptionNames(SmallVectorImpl &OptionNames) override { + void getExtraOptionNames(SmallVectorImpl &OptionNames) override { return Parser.getExtraOptionNames(OptionNames); } @@ -1367,8 +1366,7 @@ class list : public Option, public list_storage { enum ValueExpected getValueExpectedFlagDefault() const override { return Parser.getValueExpectedFlagDefault(); } - void - getExtraOptionNames(SmallVectorImpl &OptionNames) override { + void getExtraOptionNames(SmallVectorImpl &OptionNames) override { return Parser.getExtraOptionNames(OptionNames); } @@ -1507,8 +1505,7 @@ class bits : public Option, public bits_storage { enum ValueExpected getValueExpectedFlagDefault() const override { return Parser.getValueExpectedFlagDefault(); } - void - getExtraOptionNames(SmallVectorImpl &OptionNames) override { + void getExtraOptionNames(SmallVectorImpl &OptionNames) override { return Parser.getExtraOptionNames(OptionNames); } diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index 11162ce0ec4..c85a387e724 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -120,7 +120,7 @@ public: void addOption(Option *O) { bool HadErrors = false; - if (O->ArgStr[0]) { + if (O->hasArgStr()) { // Add argument to the argument map! if (!OptionsMap.insert(std::make_pair(O->ArgStr, O)).second) { errs() << ProgramName << ": CommandLine Error: Option '" << O->ArgStr @@ -151,12 +151,12 @@ public: } void removeOption(Option *O) { - SmallVector OptionNames; + SmallVector OptionNames; O->getExtraOptionNames(OptionNames); - if (O->ArgStr[0]) + if (O->hasArgStr()) OptionNames.push_back(O->ArgStr); for (auto Name : OptionNames) - OptionsMap.erase(StringRef(Name)); + OptionsMap.erase(Name); if (O->getFormattingFlag() == cl::Positional) for (auto Opt = PositionalOpts.begin(); Opt != PositionalOpts.end(); @@ -182,13 +182,13 @@ public: nullptr != ConsumeAfterOpt); } - void updateArgStr(Option *O, const char *NewName) { + void updateArgStr(Option *O, StringRef NewName) { if (!OptionsMap.insert(std::make_pair(NewName, O)).second) { errs() << ProgramName << ": CommandLine Error: Option '" << O->ArgStr << "' registered more than once!\n"; report_fatal_error("inconsistency in registered CommandLine options"); } - OptionsMap.erase(StringRef(O->ArgStr)); + OptionsMap.erase(O->ArgStr); } void printOptionValues(); @@ -227,7 +227,7 @@ void Option::addArgument() { void Option::removeArgument() { GlobalParser->removeOption(this); } -void Option::setArgStr(const char *S) { +void Option::setArgStr(StringRef S) { if (FullyInitialized) GlobalParser->updateArgStr(this, S); ArgStr = S; @@ -296,24 +296,23 @@ static Option *LookupNearestOption(StringRef Arg, ie = OptionsMap.end(); it != ie; ++it) { Option *O = it->second; - SmallVector OptionNames; + SmallVector OptionNames; O->getExtraOptionNames(OptionNames); - if (O->ArgStr[0]) + if (O->hasArgStr()) OptionNames.push_back(O->ArgStr); bool PermitValue = O->getValueExpectedFlag() != cl::ValueDisallowed; StringRef Flag = PermitValue ? LHS : Arg; - for (size_t i = 0, e = OptionNames.size(); i != e; ++i) { - StringRef Name = OptionNames[i]; + for (auto Name : OptionNames) { unsigned Distance = StringRef(Name).edit_distance( Flag, /*AllowReplacements=*/true, /*MaxEditDistance=*/BestDistance); if (!Best || Distance < BestDistance) { Best = O; BestDistance = Distance; if (RHS.empty() || !PermitValue) - NearestString = OptionNames[i]; + NearestString = Name; else - NearestString = (Twine(OptionNames[i]) + "=" + RHS).str(); + NearestString = (Twine(Name) + "=" + RHS).str(); } } } @@ -859,7 +858,7 @@ void CommandLineParser::ParseCommandLineOptions(int argc, "error - this positional option will never be matched, " "because it does not Require a value, and a " "cl::ConsumeAfter option is active!"); - } else if (UnboundedFound && !Opt->ArgStr[0]) { + } else if (UnboundedFound && !Opt->hasArgStr()) { // This option does not "require" a value... Make sure this option is // not specified after an option that eats all extra arguments, or this // one will never get any! @@ -1144,8 +1143,8 @@ bool Option::addOccurrence(unsigned pos, StringRef ArgName, StringRef Value, // getValueStr - Get the value description string, using "DefaultMsg" if nothing // has been specified yet. // -static const char *getValueStr(const Option &O, const char *DefaultMsg) { - if (O.ValueStr[0] == 0) +static StringRef getValueStr(const Option &O, StringRef DefaultMsg) { + if (O.ValueStr.empty()) return DefaultMsg; return O.ValueStr; } @@ -1155,7 +1154,7 @@ static const char *getValueStr(const Option &O, const char *DefaultMsg) { // // Return the width of the option tag for printing... -size_t alias::getOptionWidth() const { return std::strlen(ArgStr) + 6; } +size_t alias::getOptionWidth() const { return ArgStr.size() + 6; } static void printHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy) { @@ -1170,7 +1169,7 @@ static void printHelpStr(StringRef HelpStr, size_t Indent, // Print out the option for the alias. void alias::printOptionInfo(size_t GlobalWidth) const { outs() << " -" << ArgStr; - printHelpStr(HelpStr, GlobalWidth, std::strlen(ArgStr) + 6); + printHelpStr(HelpStr, GlobalWidth, ArgStr.size() + 6); } //===----------------------------------------------------------------------===// @@ -1182,9 +1181,9 @@ void alias::printOptionInfo(size_t GlobalWidth) const { // Return the width of the option tag for printing... size_t basic_parser_impl::getOptionWidth(const Option &O) const { - size_t Len = std::strlen(O.ArgStr); + size_t Len = O.ArgStr.size(); if (const char *ValName = getValueName()) - Len += std::strlen(getValueStr(O, ValName)) + 3; + Len += getValueStr(O, ValName).size() + 3; return Len + 6; } @@ -1205,7 +1204,7 @@ void basic_parser_impl::printOptionInfo(const Option &O, void basic_parser_impl::printOptionName(const Option &O, size_t GlobalWidth) const { outs() << " -" << O.ArgStr; - outs().indent(GlobalWidth - std::strlen(O.ArgStr)); + outs().indent(GlobalWidth - O.ArgStr.size()); } // parser implementation @@ -1319,7 +1318,7 @@ unsigned generic_parser_base::findOption(const char *Name) { // Return the width of the option tag for printing... size_t generic_parser_base::getOptionWidth(const Option &O) const { if (O.hasArgStr()) { - size_t Size = std::strlen(O.ArgStr) + 6; + size_t Size = O.ArgStr.size() + 6; for (unsigned i = 0, e = getNumOptions(); i != e; ++i) Size = std::max(Size, std::strlen(getOption(i)) + 8); return Size; @@ -1338,7 +1337,7 @@ void generic_parser_base::printOptionInfo(const Option &O, size_t GlobalWidth) const { if (O.hasArgStr()) { outs() << " -" << O.ArgStr; - printHelpStr(O.HelpStr, GlobalWidth, std::strlen(O.ArgStr) + 6); + printHelpStr(O.HelpStr, GlobalWidth, O.ArgStr.size() + 6); for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { size_t NumSpaces = GlobalWidth - strlen(getOption(i)) - 8; @@ -1346,7 +1345,7 @@ void generic_parser_base::printOptionInfo(const Option &O, outs().indent(NumSpaces) << " - " << getDescription(i) << '\n'; } } else { - if (O.HelpStr[0]) + if (!O.HelpStr.empty()) outs() << " " << O.HelpStr << '\n'; for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { const char *Option = getOption(i); @@ -1365,7 +1364,7 @@ void generic_parser_base::printGenericOptionDiff( const Option &O, const GenericOptionValue &Value, const GenericOptionValue &Default, size_t GlobalWidth) const { outs() << " -" << O.ArgStr; - outs().indent(GlobalWidth - std::strlen(O.ArgStr)); + outs().indent(GlobalWidth - O.ArgStr.size()); unsigned NumOpts = getNumOptions(); for (unsigned i = 0; i != NumOpts; ++i) { @@ -1508,7 +1507,7 @@ public: outs() << "USAGE: " << GlobalParser->ProgramName << " [options]"; for (auto Opt : GlobalParser->PositionalOpts) { - if (Opt->ArgStr[0]) + if (Opt->hasArgStr()) outs() << " --" << Opt->ArgStr; outs() << " " << Opt->HelpStr; } diff --git a/unittests/Support/CommandLineTest.cpp b/unittests/Support/CommandLineTest.cpp index 2ae30c21ec4..eac669f467b 100644 --- a/unittests/Support/CommandLineTest.cpp +++ b/unittests/Support/CommandLineTest.cpp @@ -94,16 +94,16 @@ TEST(CommandLineTest, ModifyExisitingOption) { "Failed to modify option's option category."; Retrieved->setDescription(Description); - ASSERT_STREQ(Retrieved->HelpStr, Description) << - "Changing option description failed."; + ASSERT_STREQ(Retrieved->HelpStr.data(), Description) + << "Changing option description failed."; Retrieved->setArgStr(ArgString); - ASSERT_STREQ(ArgString, Retrieved->ArgStr) << - "Failed to modify option's Argument string."; + ASSERT_STREQ(ArgString, Retrieved->ArgStr.data()) + << "Failed to modify option's Argument string."; Retrieved->setValueStr(ValueString); - ASSERT_STREQ(Retrieved->ValueStr, ValueString) << - "Failed to modify option's Value string."; + ASSERT_STREQ(Retrieved->ValueStr.data(), ValueString) + << "Failed to modify option's Value string."; Retrieved->setHiddenFlag(cl::Hidden); ASSERT_EQ(cl::Hidden, TestOption.getOptionHiddenFlag()) << diff --git a/utils/FileCheck/FileCheck.cpp b/utils/FileCheck/FileCheck.cpp index 50d324a5e46..f73a0fee76c 100644 --- a/utils/FileCheck/FileCheck.cpp +++ b/utils/FileCheck/FileCheck.cpp @@ -857,7 +857,7 @@ static bool ReadCheckFile(SourceMgr &SM, for (const auto &PatternString : ImplicitCheckNot) { // Create a buffer with fake command line content in order to display the // command line option responsible for the specific implicit CHECK-NOT. - std::string Prefix = std::string("-") + ImplicitCheckNot.ArgStr + "='"; + std::string Prefix = (Twine("-") + ImplicitCheckNot.ArgStr + "='").str(); std::string Suffix = "'"; std::unique_ptr CmdLine = MemoryBuffer::getMemBufferCopy( Prefix + PatternString + Suffix, "command line");