Author: Jan Svoboda Date: 2021-01-07T11:52:06+01:00 New Revision: a828fb463ed9f6085849bb3a4f225b3c84e7cf29
URL: https://github.com/llvm/llvm-project/commit/a828fb463ed9f6085849bb3a4f225b3c84e7cf29 DIFF: https://github.com/llvm/llvm-project/commit/a828fb463ed9f6085849bb3a4f225b3c84e7cf29.diff LOG: [clang][cli] Port a CommaJoined option to the marshalling infrastructure Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D93698 Added: Modified: clang/include/clang/Driver/Options.td clang/lib/Frontend/CompilerInvocation.cpp clang/unittests/Frontend/CompilerInvocationTest.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 33b5cd09004e..6b5ae35ad7e0 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1201,7 +1201,7 @@ def fansi_escape_codes : Flag<["-"], "fansi-escape-codes">, Group<f_Group>, MarshallingInfoFlag<"DiagnosticOpts->UseANSIEscapeCodes">; def fcomment_block_commands : CommaJoined<["-"], "fcomment-block-commands=">, Group<f_clang_Group>, Flags<[CC1Option]>, HelpText<"Treat each comma separated argument in <arg> as a documentation comment block command">, - MetaVarName<"<arg>">; + MetaVarName<"<arg>">, MarshallingInfoStringVector<"LangOpts->CommentOpts.BlockCommandNames">; def fparse_all_comments : Flag<["-"], "fparse-all-comments">, Group<f_clang_Group>, Flags<[CC1Option]>, MarshallingInfoFlag<"LangOpts->CommentOpts.ParseAllComments">; def frecord_command_line : Flag<["-"], "frecord-command-line">, diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 962f72963cd2..da4213e8952e 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -328,8 +328,20 @@ static void denormalizeStringVector(SmallVectorImpl<const char *> &Args, Option::OptionClass OptClass, unsigned TableIndex, const std::vector<std::string> &Values) { - for (const std::string &Value : Values) { - denormalizeString(Args, Spelling, SA, OptClass, TableIndex, Value); + if (OptClass == Option::OptionClass::CommaJoinedClass) { + std::string CommaJoinedValue; + if (!Values.empty()) { + CommaJoinedValue.append(Values.front()); + for (const std::string &Value : llvm::drop_begin(Values, 1)) { + CommaJoinedValue.append(","); + CommaJoinedValue.append(Value); + } + } + denormalizeString(Args, Spelling, SA, Option::OptionClass::JoinedClass, + TableIndex, CommaJoinedValue); + } else if (OptClass == Option::OptionClass::JoinedClass) { + for (const std::string &Value : Values) + denormalizeString(Args, Spelling, SA, OptClass, TableIndex, Value); } } @@ -785,7 +797,6 @@ static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts, } static void ParseCommentArgs(CommentOptions &Opts, ArgList &Args) { - Opts.BlockCommandNames = Args.getAllArgValues(OPT_fcomment_block_commands); Opts.ParseAllComments = Args.hasArg(OPT_fparse_all_comments); } diff --git a/clang/unittests/Frontend/CompilerInvocationTest.cpp b/clang/unittests/Frontend/CompilerInvocationTest.cpp index 8fcf34d5c874..7b8efb9af2e2 100644 --- a/clang/unittests/Frontend/CompilerInvocationTest.cpp +++ b/clang/unittests/Frontend/CompilerInvocationTest.cpp @@ -508,6 +508,53 @@ TEST_F(CommandLineTest, StringVectorMultiple) { ASSERT_THAT(GeneratedArgs, ContainsN(HasSubstr("-fmodule-map-file"), 2)); } +// CommaJoined option with MarshallingInfoStringVector. + +TEST_F(CommandLineTest, StringVectorCommaJoinedNone) { + const char *Args[] = {""}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_TRUE(Invocation.getLangOpts()->CommentOpts.BlockCommandNames.empty()); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + + ASSERT_THAT(GeneratedArgs, + Not(Contains(HasSubstr("-fcomment-block-commands")))); +} + +TEST_F(CommandLineTest, StringVectorCommaJoinedSingle) { + const char *Args[] = {"-fcomment-block-commands=x,y"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_EQ(Invocation.getLangOpts()->CommentOpts.BlockCommandNames, + std::vector<std::string>({"x", "y"})); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + + ASSERT_THAT(GeneratedArgs, + ContainsN(StrEq("-fcomment-block-commands=x,y"), 1)); +} + +TEST_F(CommandLineTest, StringVectorCommaJoinedMultiple) { + const char *Args[] = {"-fcomment-block-commands=x,y", + "-fcomment-block-commands=a,b"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_EQ(Invocation.getLangOpts()->CommentOpts.BlockCommandNames, + std::vector<std::string>({"x", "y", "a", "b"})); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + + ASSERT_THAT(GeneratedArgs, + ContainsN(StrEq("-fcomment-block-commands=x,y,a,b"), 1)); +} + // A flag that should be parsed only if a condition is met. TEST_F(CommandLineTest, ConditionalParsingIfFalseFlagNotPresent) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits