diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -152,9 +152,10 @@ #include "clang/Driver/Options.inc" #undef SIMPLE_ENUM_VALUE_TABLE -static llvm::Optional -normalizeSimpleFlag(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, bool &Success) { +static llvm::Optional normalizeSimpleFlag(OptSpecifier Opt, + unsigned TableIndex, + const ArgList &Args, + DiagnosticsEngine &Diags) { if (Args.hasArg(Opt)) return true; return None; @@ -162,8 +163,7 @@ static Optional normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, const ArgList &Args, - DiagnosticsEngine &, - bool &Success) { + DiagnosticsEngine &) { if (Args.hasArg(Opt)) return false; return None; @@ -189,7 +189,7 @@ std::enable_if_t(), bool> = false> static auto makeFlagToValueNormalizer(T Value) { return [Value](OptSpecifier Opt, unsigned, const ArgList &Args, - DiagnosticsEngine &, bool &Success) -> Optional { + DiagnosticsEngine &) -> Optional { if (Args.hasArg(Opt)) return Value; return None; @@ -205,8 +205,8 @@ static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, OptSpecifier OtherOpt) { return [Value, OtherValue, OtherOpt](OptSpecifier Opt, unsigned, - const ArgList &Args, DiagnosticsEngine &, - bool &Success) -> Optional { + const ArgList &Args, + DiagnosticsEngine &) -> Optional { if (const Arg *A = Args.getLastArg(Opt, OtherOpt)) { return A->getOption().matches(Opt) ? Value : OtherValue; } @@ -271,9 +271,10 @@ return None; } -static llvm::Optional -normalizeSimpleEnum(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, bool &Success) { +static llvm::Optional normalizeSimpleEnum(OptSpecifier Opt, + unsigned TableIndex, + const ArgList &Args, + DiagnosticsEngine &Diags) { assert(TableIndex < SimpleEnumValueTablesSize); const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex]; @@ -285,7 +286,6 @@ if (auto MaybeEnumVal = findValueTableByName(Table, ArgValue)) return MaybeEnumVal->Value; - Success = false; Diags.Report(diag::err_drv_invalid_value) << Arg->getAsString(Args) << ArgValue; return None; @@ -319,8 +319,7 @@ static Optional normalizeString(OptSpecifier Opt, int TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, - bool &Success) { + DiagnosticsEngine &Diags) { auto *Arg = Args.getLastArg(Opt); if (!Arg) return None; @@ -328,15 +327,14 @@ } template -static Optional -normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args, - DiagnosticsEngine &Diags, bool &Success) { +static Optional normalizeStringIntegral(OptSpecifier Opt, int, + const ArgList &Args, + DiagnosticsEngine &Diags) { auto *Arg = Args.getLastArg(Opt); if (!Arg) return None; IntTy Res; if (StringRef(Arg->getValue()).getAsInteger(0, Res)) { - Success = false; Diags.Report(diag::err_drv_invalid_int_value) << Arg->getAsString(Args) << Arg->getValue(); return None; @@ -346,7 +344,7 @@ static Optional> normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args, - DiagnosticsEngine &, bool &Success) { + DiagnosticsEngine &) { return Args.getAllArgValues(Opt); } @@ -384,8 +382,7 @@ static Optional normalizeTriple(OptSpecifier Opt, int TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, - bool &Success) { + DiagnosticsEngine &Diags) { auto *Arg = Args.getLastArg(Opt); if (!Arg) return None; @@ -410,17 +407,15 @@ return ((KeyPath & Value) == Value) ? static_cast(Value) : T(); } -#define PARSE_OPTION_WITH_MARSHALLING(ARGS, DIAGS, SUCCESS, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, \ - NORMALIZER, MERGER, TABLE_INDEX) \ +#define PARSE_OPTION_WITH_MARSHALLING( \ + ARGS, DIAGS, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) \ if ((FLAGS)&options::CC1Option) { \ KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \ if (IMPLIED_CHECK) \ KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \ if (SHOULD_PARSE) \ - if (auto MaybeValue = \ - NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS, SUCCESS)) \ + if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS)) \ KEYPATH = \ MERGER(KEYPATH, static_cast(*MaybeValue)); \ } @@ -878,18 +873,18 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags) { + unsigned NumErrorsBefore = Diags.getNumErrors(); + AnalyzerOptions *AnalyzerOpts = &Opts; - bool Success = true; #define ANALYZER_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef ANALYZER_OPTION_WITH_MARSHALLING @@ -903,7 +898,6 @@ if (Value == NumStores) { Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; - Success = false; } else { Opts.AnalysisStoreOpt = Value; } @@ -919,7 +913,6 @@ if (Value == NumConstraints) { Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; - Success = false; } else { Opts.AnalysisConstraintsOpt = Value; } @@ -935,7 +928,6 @@ if (Value == NUM_ANALYSIS_DIAG_CLIENTS) { Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; - Success = false; } else { Opts.AnalysisDiagOpt = Value; } @@ -951,7 +943,6 @@ if (Value == NumPurgeModes) { Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; - Success = false; } else { Opts.AnalysisPurgeOpt = Value; } @@ -967,7 +958,6 @@ if (Value == NumInliningModes) { Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; - Success = false; } else { Opts.InliningMode = Value; } @@ -1002,24 +992,20 @@ if (val.empty()) { Diags.Report(SourceLocation(), diag::err_analyzer_config_no_value) << configVal; - Success = false; break; } if (val.find('=') != StringRef::npos) { Diags.Report(SourceLocation(), diag::err_analyzer_config_multiple_values) << configVal; - Success = false; break; } // TODO: Check checker options too, possibly in CheckerRegistry. // Leave unknown non-checker configs unclaimed. if (!key.contains(":") && Opts.isUnknownAnalyzerConfig(key)) { - if (Opts.ShouldEmitErrorsOnInvalidConfigValue) { + if (Opts.ShouldEmitErrorsOnInvalidConfigValue) Diags.Report(diag::err_analyzer_config_unknown) << key; - Success = false; - } continue; } @@ -1041,7 +1027,7 @@ } os.flush(); - return Success; + return Diags.getNumErrors() == NumErrorsBefore; } static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config, @@ -1564,8 +1550,6 @@ const LangOptions &LangOptsRef) { unsigned NumErrorsBefore = Diags.getNumErrors(); - bool Success = true; - unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags); // TODO: This could be done in Driver unsigned MaxOptLevel = 3; @@ -1590,10 +1574,9 @@ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef CODEGEN_OPTION_WITH_MARSHALLING @@ -1801,10 +1784,8 @@ Opts.CFProtectionReturn = 1; else if (Name == "branch") Opts.CFProtectionBranch = 1; - else if (Name != "none") { + else if (Name != "none") Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; - Success = false; - } } for (auto *A : @@ -1962,7 +1943,7 @@ else if (Args.hasArg(options::OPT_fno_finite_loops)) Opts.FiniteLoops = CodeGenOptions::FiniteLoopsKind::Never; - return Success && Diags.getNumErrors() == NumErrorsBefore; + return Diags.getNumErrors() == NumErrorsBefore; } static void @@ -2009,7 +1990,6 @@ frontend::ActionKind Action, bool ShowLineMarkers) { unsigned NumErrorsBefore = Diags.getNumErrors(); - bool Success = true; DependencyOutputOptions &DependencyOutputOpts = Opts; #define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING( \ @@ -2017,10 +1997,9 @@ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING @@ -2069,7 +2048,7 @@ Opts.ExtraDeps.emplace_back(std::string(Val), EDK_ModuleFile); } - return Success && Diags.getNumErrors() == NumErrorsBefore; + return Diags.getNumErrors() == NumErrorsBefore; } static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor) { @@ -2142,29 +2121,28 @@ static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags) { + unsigned NumErrorsBefore = Diags.getNumErrors(); + FileSystemOptions &FileSystemOpts = Opts; - bool Success = true; #define FILE_SYSTEM_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef FILE_SYSTEM_OPTION_WITH_MARSHALLING - return Success; + return Diags.getNumErrors() == NumErrorsBefore; } static void GenerateMigratorArgs(const MigratorOptions &Opts, SmallVectorImpl &Args, CompilerInvocation::StringAllocator SA) { const MigratorOptions &MigratorOpts = Opts; - #define MIGRATOR_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ @@ -2179,22 +2157,22 @@ static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, DiagnosticsEngine &Diags) { + unsigned NumErrorsBefore = Diags.getNumErrors(); + MigratorOptions &MigratorOpts = Opts; - bool Success = true; #define MIGRATOR_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef MIGRATOR_OPTION_WITH_MARSHALLING - return Success; + return Diags.getNumErrors() == NumErrorsBefore; } void CompilerInvocation::GenerateDiagnosticArgs( @@ -2273,20 +2251,20 @@ Diags = &*IgnoringDiags; } + unsigned NumErrorsBefore = Diags->getNumErrors(); + // The key paths of diagnostic options defined in Options.td start with // "DiagnosticOpts->". Let's provide the expected variable name and type. DiagnosticOptions *DiagnosticOpts = &Opts; - bool Success = true; #define DIAG_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, *Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef DIAG_OPTION_WITH_MARSHALLING @@ -2303,16 +2281,14 @@ Opts.VerifyPrefixes.push_back("expected"); // Keep VerifyPrefixes in its original order for the sake of diagnostics, and // then sort it to prepare for fast lookup using std::binary_search. - if (!checkVerifyPrefixes(Opts.VerifyPrefixes, *Diags)) { + if (!checkVerifyPrefixes(Opts.VerifyPrefixes, *Diags)) Opts.VerifyDiagnostics = false; - Success = false; - } else llvm::sort(Opts.VerifyPrefixes); DiagnosticLevelMask DiagMask = DiagnosticLevelMask::None; - Success &= parseDiagnosticLevelMask("-verify-ignore-unexpected=", - Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), - *Diags, DiagMask); + parseDiagnosticLevelMask( + "-verify-ignore-unexpected=", + Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), *Diags, DiagMask); if (Args.hasArg(OPT_verify_ignore_unexpected)) DiagMask = DiagnosticLevelMask::All; Opts.setVerifyIgnoreUnexpected(DiagMask); @@ -2325,7 +2301,7 @@ addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings); addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks); - return Success; + return Diags->getNumErrors() == NumErrorsBefore; } /// Parse the argument to the -ftest-module-file-extension @@ -2587,18 +2563,18 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, bool &IsHeaderFile) { - FrontendOptions &FrontendOpts = Opts; - bool Success = true; unsigned NumErrorsBefore = Diags.getNumErrors(); + + FrontendOptions &FrontendOpts = Opts; + #define FRONTEND_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef FRONTEND_OPTION_WITH_MARSHALLING @@ -2942,18 +2918,18 @@ static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, const std::string &WorkingDir) { + unsigned NumErrorsBefore = Diags.getNumErrors(); + HeaderSearchOptions *HeaderSearchOpts = &Opts; - bool Success = true; #define HEADER_SEARCH_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef HEADER_SEARCH_OPTION_WITH_MARSHALLING @@ -3071,7 +3047,7 @@ for (const auto *A : Args.filtered(OPT_ivfsoverlay)) Opts.AddVFSOverlayFile(A->getValue()); - return Success; + return Diags.getNumErrors() == NumErrorsBefore; } void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, @@ -3596,17 +3572,15 @@ // The key paths of codegen options defined in Options.td start with // "LangOpts->". Let's provide the expected variable name and type. LangOptions *LangOpts = &Opts; - bool Success = true; #define LANG_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef LANG_OPTION_WITH_MARSHALLING @@ -3981,7 +3955,7 @@ } } - return Success && Diags.getNumErrors() == NumErrorsBefore; + return Diags.getNumErrors() == NumErrorsBefore; } static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) { @@ -4103,18 +4077,18 @@ DiagnosticsEngine &Diags, frontend::ActionKind Action, const FrontendOptions &FrontendOpts) { + unsigned NumErrorsBefore = Diags.getNumErrors(); + PreprocessorOptions *PreprocessorOpts = &Opts; - bool Success = true; #define PREPROCESSOR_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OPTION_WITH_MARSHALLING @@ -4189,7 +4163,7 @@ if (isStrictlyPreprocessorAction(Action)) Opts.LexEditorPlaceholders = false; - return Success; + return Diags.getNumErrors() == NumErrorsBefore; } static void GeneratePreprocessorOutputArgs( @@ -4218,26 +4192,25 @@ static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags, frontend::ActionKind Action) { - PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; unsigned NumErrorsBefore = Diags.getNumErrors(); - bool Success = true; + + PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; #define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING Opts.ShowCPP = isStrictlyPreprocessorAction(Action) && !Args.hasArg(OPT_dM); Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD); - return Success && Diags.getNumErrors() == NumErrorsBefore; + return Diags.getNumErrors() == NumErrorsBefore; } static void GenerateTargetArgs(const TargetOptions &Opts, @@ -4262,19 +4235,18 @@ static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags) { - TargetOptions *TargetOpts = &Opts; unsigned NumErrorsBefore = Diags.getNumErrors(); - bool Success = true; + + TargetOptions *TargetOpts = &Opts; #define TARGET_OPTION_WITH_MARSHALLING( \ PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \ - SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - MERGER, TABLE_INDEX) + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ + IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef TARGET_OPTION_WITH_MARSHALLING @@ -4287,13 +4259,13 @@ Opts.SDKVersion = Version; } - return Success && Diags.getNumErrors() == NumErrorsBefore; + return Diags.getNumErrors() == NumErrorsBefore; } bool CompilerInvocation::CreateFromArgsImpl( CompilerInvocation &Res, ArrayRef CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0) { - bool Success = true; + unsigned NumErrorsBefore = Diags.getNumErrors(); // Parse the arguments. const OptTable &Opts = getDriverOptTable(); @@ -4304,11 +4276,9 @@ LangOptions &LangOpts = *Res.getLangOpts(); // Check for missing argument error. - if (MissingArgCount) { + if (MissingArgCount) Diags.Report(diag::err_drv_missing_argument) << Args.getArgString(MissingArgIndex) << MissingArgCount; - Success = false; - } // Issue errors on unknown arguments. for (const auto *A : Args.filtered(OPT_UNKNOWN)) { @@ -4319,19 +4289,17 @@ else Diags.Report(diag::err_drv_unknown_argument_with_suggestion) << ArgString << Nearest; - Success = false; } - Success &= ParseFileSystemArgs(Res.getFileSystemOpts(), Args, Diags); - Success &= ParseMigratorArgs(Res.getMigratorOpts(), Args, Diags); - Success &= ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags); - Success &= ParseDiagnosticArgs(Res.getDiagnosticOpts(), Args, &Diags, - /*DefaultDiagColor=*/false); - Success &= ParseFrontendArgs(Res.getFrontendOpts(), Args, Diags, - LangOpts.IsHeaderFile); + ParseFileSystemArgs(Res.getFileSystemOpts(), Args, Diags); + ParseMigratorArgs(Res.getMigratorOpts(), Args, Diags); + ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags); + ParseDiagnosticArgs(Res.getDiagnosticOpts(), Args, &Diags, + /*DefaultDiagColor=*/false); + ParseFrontendArgs(Res.getFrontendOpts(), Args, Diags, LangOpts.IsHeaderFile); // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; - Success &= ParseTargetArgs(Res.getTargetOpts(), Args, Diags); + ParseTargetArgs(Res.getTargetOpts(), Args, Diags); llvm::Triple T(Res.getTargetOpts().Triple); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); @@ -4351,8 +4319,8 @@ } else { // Other LangOpts are only initialized when the input is not AST or LLVM IR. // FIXME: Should we really be calling this for an Language::Asm input? - Success &= ParseLangArgs(LangOpts, Args, DashX, T, - Res.getPreprocessorOpts().Includes, Diags); + ParseLangArgs(LangOpts, Args, DashX, T, Res.getPreprocessorOpts().Includes, + Diags); if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC) LangOpts.ObjCExceptions = 1; } @@ -4368,8 +4336,8 @@ if (LangOpts.OpenMPIsDevice) Res.getTargetOpts().HostTriple = Res.getFrontendOpts().AuxTriple; - Success &= ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags, T, - Res.getFrontendOpts().OutputFile, LangOpts); + ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags, T, + Res.getFrontendOpts().OutputFile, LangOpts); // FIXME: Override value name discarding when asan or msan is used because the // backend passes depend on the name of the alloca in order to print out @@ -4390,10 +4358,8 @@ Res.getFrontendOpts().ProgramAction, Res.getPreprocessorOutputOpts().ShowLineMarkers); if (!Res.getDependencyOutputOpts().OutputFile.empty() && - Res.getDependencyOutputOpts().Targets.empty()) { + Res.getDependencyOutputOpts().Targets.empty()) Diags.Report(diag::err_fe_dependency_file_requires_MT); - Success = false; - } // If sanitizer is enabled, disable OPT_ffine_grained_bitfield_accesses. if (Res.getCodeGenOpts().FineGrainedBitfieldAccesses && @@ -4406,9 +4372,9 @@ Res.getCodeGenOpts().Argv0 = Argv0; Res.getCodeGenOpts().CommandLineArgs = CommandLineArgs; - Success &= FixupInvocation(Res, Diags, Args, DashX); + FixupInvocation(Res, Diags, Args, DashX); - return Success; + return Diags.getNumErrors() == NumErrorsBefore; } bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Invocation,