mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-02 19:24:25 +00:00
Support: Fix option handling when using cl::Required with aliasopt
Until now, attempting to create an alias of a required option would complain if the user supplied the alias, because the required option didn't have a value. Similarly, if you said the alias was required, then using the base option would complain that the alias wasn't supplied. Lastly, if you put required on both, *neither* option would work. By changning alias to overload addOccurrence and setting cl::Required on the original option, we can get this to behave in a more useful way. I've also added a test and updated a user that was getting this wrong. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212986 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -270,8 +270,8 @@ public:
|
|||||||
|
|
||||||
// addOccurrence - Wrapper around handleOccurrence that enforces Flags.
|
// addOccurrence - Wrapper around handleOccurrence that enforces Flags.
|
||||||
//
|
//
|
||||||
bool addOccurrence(unsigned pos, StringRef ArgName,
|
virtual bool addOccurrence(unsigned pos, StringRef ArgName,
|
||||||
StringRef Value, bool MultiArg = false);
|
StringRef Value, bool MultiArg = false);
|
||||||
|
|
||||||
// Prints option name followed by message. Always returns true.
|
// Prints option name followed by message. Always returns true.
|
||||||
bool error(const Twine &Message, StringRef ArgName = StringRef());
|
bool error(const Twine &Message, StringRef ArgName = StringRef());
|
||||||
@ -1649,6 +1649,10 @@ class alias : public Option {
|
|||||||
StringRef Arg) override {
|
StringRef Arg) override {
|
||||||
return AliasFor->handleOccurrence(pos, AliasFor->ArgStr, Arg);
|
return AliasFor->handleOccurrence(pos, AliasFor->ArgStr, Arg);
|
||||||
}
|
}
|
||||||
|
bool addOccurrence(unsigned pos, StringRef /*ArgName*/,
|
||||||
|
StringRef Value, bool MultiArg = false) override {
|
||||||
|
return AliasFor->addOccurrence(pos, AliasFor->ArgStr, Value, MultiArg);
|
||||||
|
}
|
||||||
// Handle printing stuff...
|
// Handle printing stuff...
|
||||||
size_t getOptionWidth() const override;
|
size_t getOptionWidth() const override;
|
||||||
void printOptionInfo(size_t GlobalWidth) const override;
|
void printOptionInfo(size_t GlobalWidth) const override;
|
||||||
|
@ -38,9 +38,9 @@ int merge_main(int argc, const char *argv[]) {
|
|||||||
cl::desc("<filenames...>"));
|
cl::desc("<filenames...>"));
|
||||||
|
|
||||||
cl::opt<std::string> OutputFilename("output", cl::value_desc("output"),
|
cl::opt<std::string> OutputFilename("output", cl::value_desc("output"),
|
||||||
cl::init("-"),
|
cl::init("-"), cl::Required,
|
||||||
cl::desc("Output file"));
|
cl::desc("Output file"));
|
||||||
cl::alias OutputFilenameA("o", cl::desc("Alias for --output"), cl::Required,
|
cl::alias OutputFilenameA("o", cl::desc("Alias for --output"),
|
||||||
cl::aliasopt(OutputFilename));
|
cl::aliasopt(OutputFilename));
|
||||||
|
|
||||||
cl::ParseCommandLineOptions(argc, argv, "LLVM profile data merger\n");
|
cl::ParseCommandLineOptions(argc, argv, "LLVM profile data merger\n");
|
||||||
|
@ -212,4 +212,23 @@ TEST(CommandLineTest, AliasesWithArguments) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testAliasRequired(int argc, const char *const *argv) {
|
||||||
|
StackOption<std::string> Option("option", cl::Required);
|
||||||
|
cl::alias Alias("o", llvm::cl::aliasopt(Option));
|
||||||
|
|
||||||
|
cl::ParseCommandLineOptions(argc, argv);
|
||||||
|
EXPECT_EQ("x", Option);
|
||||||
|
EXPECT_EQ(1, Option.getNumOccurrences());
|
||||||
|
|
||||||
|
Alias.removeArgument();
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CommandLineTest, AliasRequired) {
|
||||||
|
const char *opts1[] = { "-tool", "-option=x" };
|
||||||
|
const char *opts2[] = { "-tool", "-o", "x" };
|
||||||
|
testAliasRequired(array_lengthof(opts1), opts1);
|
||||||
|
testAliasRequired(array_lengthof(opts2), opts2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
Reference in New Issue
Block a user