Index: lib/Support/CommandLine.cpp =================================================================== --- lib/Support/CommandLine.cpp +++ lib/Support/CommandLine.cpp @@ -671,10 +671,13 @@ StringRef OneArgName = Arg.substr(0, Length); Arg = Arg.substr(Length); - // Because ValueRequired is an invalid flag for grouped arguments, - // we don't need to pass argc/argv in. - assert(PGOpt->getValueExpectedFlag() != cl::ValueRequired && - "Option can not be cl::Grouping AND cl::ValueRequired!"); + if (PGOpt->getValueExpectedFlag() == cl::ValueRequired) { + ErrorParsing |= PGOpt->error("may not occur within a group!"); + return nullptr; + } + + // Because the value for the option is not required, we don't need to pass + // argc/argv in. int Dummy = 0; ErrorParsing |= ProvideOption(PGOpt, OneArgName, StringRef(), 0, nullptr, Dummy); Index: unittests/Support/CommandLineTest.cpp =================================================================== --- unittests/Support/CommandLineTest.cpp +++ unittests/Support/CommandLineTest.cpp @@ -1128,4 +1128,25 @@ EXPECT_TRUE(MacroDefs.front().compare("HAVE_FOO") == 0); } +TEST(CommandLineTest, GroupingWithValue) { + cl::ResetCommandLineParser(); + + StackOption OptF("f", cl::Grouping, cl::desc("Some flag")); + StackOption OptV("v", cl::Grouping, + cl::desc("Grouping option with a value")); + + // Should be possible to use an option which requires a value + // at the end of a group. + const char *args1[] = {"prog", "-fv", "val1"}; + EXPECT_TRUE( + cl::ParseCommandLineOptions(3, args1, StringRef(), &llvm::nulls())); + EXPECT_STREQ("val1", OptV.c_str()); + cl::ResetAllOptionOccurrences(); + + // Should not crash if it is accidentally used in the middle of a group. + const char *args2[] = {"prog", "-vf", "val2"}; + EXPECT_FALSE( + cl::ParseCommandLineOptions(3, args2, StringRef(), &llvm::nulls())); +} + } // anonymous namespace