diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -242,10 +242,10 @@ /// table-gen definition /// /// \param Args - The argument list containing the arguments to parse - /// \param Diags - The DiagnosticsEngine associated with CreateFromArgs + /// \param DiagsRef - The DiagnosticsEngine associated with CreateFromArgs /// \returns - True if parsing was successful, false otherwise bool parseSimpleArgs(const llvm::opt::ArgList &Args, - DiagnosticsEngine &Diags); + DiagnosticsEngine &DiagsRef); }; IntrusiveRefCntPtr 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 @@ -131,7 +131,7 @@ static llvm::Optional normalizeSimpleFlag(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, bool &Success) { + DiagnosticsEngine *Diags, bool &Success) { if (Args.hasArg(Opt)) return true; return None; @@ -139,7 +139,7 @@ static Optional normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, const ArgList &Args, - DiagnosticsEngine &, + DiagnosticsEngine *, bool &Success) { if (Args.hasArg(Opt)) return false; @@ -166,7 +166,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 *, bool &Success) -> Optional { if (Args.hasArg(Opt)) return Value; return None; @@ -182,7 +182,7 @@ static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, OptSpecifier OtherOpt) { return [Value, OtherValue, OtherOpt](OptSpecifier Opt, unsigned, - const ArgList &Args, DiagnosticsEngine &, + const ArgList &Args, DiagnosticsEngine *, bool &Success) -> Optional { if (const Arg *A = Args.getLastArg(Opt, OtherOpt)) { return A->getOption().matches(Opt) ? Value : OtherValue; @@ -248,7 +248,7 @@ static llvm::Optional normalizeSimpleEnum(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, bool &Success) { + DiagnosticsEngine *Diags, bool &Success) { assert(TableIndex < SimpleEnumValueTablesSize); const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex]; @@ -261,8 +261,9 @@ return MaybeEnumVal->Value; Success = false; - Diags.Report(diag::err_drv_invalid_value) - << Arg->getAsString(Args) << ArgValue; + if (Diags) + Diags->Report(diag::err_drv_invalid_value) + << Arg->getAsString(Args) << ArgValue; return None; } @@ -294,7 +295,7 @@ static Optional normalizeString(OptSpecifier Opt, int TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, + DiagnosticsEngine *Diags, bool &Success) { auto *Arg = Args.getLastArg(Opt); if (!Arg) @@ -305,22 +306,23 @@ template static Optional normalizeStringIntegral(OptSpecifier Opt, int, const ArgList &Args, - DiagnosticsEngine &Diags, bool &Success) { + DiagnosticsEngine *Diags, bool &Success) { 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(); + if (Diags) + Diags->Report(diag::err_drv_invalid_int_value) + << Arg->getAsString(Args) << Arg->getValue(); } return Res; } static Optional> normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args, - DiagnosticsEngine &, bool &Success) { + DiagnosticsEngine *, bool &Success) { return Args.getAllArgValues(Opt); } @@ -356,7 +358,7 @@ static Optional normalizeTriple(OptSpecifier Opt, int TableIndex, const ArgList &Args, - DiagnosticsEngine &Diags, + DiagnosticsEngine *Diags, bool &Success) { auto *Arg = Args.getLastArg(Opt); if (!Arg) @@ -2990,7 +2992,9 @@ } bool CompilerInvocation::parseSimpleArgs(const ArgList &Args, - DiagnosticsEngine &Diags) { + DiagnosticsEngine &DiagsRef) { + DiagnosticsEngine *Diags = &DiagsRef; + bool Success = true; #define OPTION_WITH_MARSHALLING( \