diff options
Diffstat (limited to 'clang/lib/Driver/ToolChains/Clang.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 90 |
1 files changed, 28 insertions, 62 deletions
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index adaa6b3..412a176 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2723,42 +2723,6 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, } } -static void EmitComplexRangeDiag(const Driver &D, StringRef LastOpt, - LangOptions::ComplexRangeKind Range, - StringRef NewOpt, - LangOptions::ComplexRangeKind NewRange) { - // Do not emit a warning if NewOpt overrides LastOpt in the following cases. - // - // | LastOpt | NewOpt | - // |-----------------------|-----------------------| - // | -fcx-limited-range | -fno-cx-limited-range | - // | -fno-cx-limited-range | -fcx-limited-range | - // | -fcx-fortran-rules | -fno-cx-fortran-rules | - // | -fno-cx-fortran-rules | -fcx-fortran-rules | - // | -ffast-math | -fno-fast-math | - // | -ffp-model= | -ffast-math | - // | -ffp-model= | -fno-fast-math | - // | -ffp-model= | -ffp-model= | - // | -fcomplex-arithmetic= | -fcomplex-arithmetic= | - if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() || - (LastOpt == "-fcx-limited-range" && NewOpt == "-fno-cx-limited-range") || - (LastOpt == "-fno-cx-limited-range" && NewOpt == "-fcx-limited-range") || - (LastOpt == "-fcx-fortran-rules" && NewOpt == "-fno-cx-fortran-rules") || - (LastOpt == "-fno-cx-fortran-rules" && NewOpt == "-fcx-fortran-rules") || - (LastOpt == "-ffast-math" && NewOpt == "-fno-fast-math") || - (LastOpt.starts_with("-ffp-model=") && NewOpt == "-ffast-math") || - (LastOpt.starts_with("-ffp-model=") && NewOpt == "-fno-fast-math") || - (LastOpt.starts_with("-ffp-model=") && - NewOpt.starts_with("-ffp-model=")) || - (LastOpt.starts_with("-fcomplex-arithmetic=") && - NewOpt.starts_with("-fcomplex-arithmetic="))) - return; - - D.Diag(clang::diag::warn_drv_overriding_complex_range) - << LastOpt << NewOpt << complexRangeKindToStr(Range) - << complexRangeKindToStr(NewRange); -} - static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, @@ -2815,27 +2779,19 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, std::string ComplexRangeStr; StringRef LastComplexRangeOption; - auto setComplexRange = [&](StringRef NewOption, - LangOptions::ComplexRangeKind NewRange) { - // Warn if user overrides the previously set complex number - // multiplication/division option. - if (Range != LangOptions::ComplexRangeKind::CX_None && Range != NewRange) - EmitComplexRangeDiag(D, LastComplexRangeOption, Range, NewOption, - NewRange); - LastComplexRangeOption = NewOption; - Range = NewRange; - }; - // Lambda to set fast-math options. This is also used by -ffp-model=fast auto applyFastMath = [&](bool Aggressive, StringRef CallerOption) { if (Aggressive) { HonorINFs = false; HonorNaNs = false; - setComplexRange(CallerOption, LangOptions::ComplexRangeKind::CX_Basic); + setComplexRange(D, CallerOption, LangOptions::ComplexRangeKind::CX_Basic, + LastComplexRangeOption, Range); } else { HonorINFs = true; HonorNaNs = true; - setComplexRange(CallerOption, LangOptions::ComplexRangeKind::CX_Promoted); + setComplexRange(D, CallerOption, + LangOptions::ComplexRangeKind::CX_Promoted, + LastComplexRangeOption, Range); } MathErrno = false; AssociativeMath = true; @@ -2887,18 +2843,24 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, default: continue; case options::OPT_fcx_limited_range: - setComplexRange(A->getSpelling(), - LangOptions::ComplexRangeKind::CX_Basic); + setComplexRange(D, A->getSpelling(), + LangOptions::ComplexRangeKind::CX_Basic, + LastComplexRangeOption, Range); break; case options::OPT_fno_cx_limited_range: - setComplexRange(A->getSpelling(), LangOptions::ComplexRangeKind::CX_Full); + setComplexRange(D, A->getSpelling(), + LangOptions::ComplexRangeKind::CX_Full, + LastComplexRangeOption, Range); break; case options::OPT_fcx_fortran_rules: - setComplexRange(A->getSpelling(), - LangOptions::ComplexRangeKind::CX_Improved); + setComplexRange(D, A->getSpelling(), + LangOptions::ComplexRangeKind::CX_Improved, + LastComplexRangeOption, Range); break; case options::OPT_fno_cx_fortran_rules: - setComplexRange(A->getSpelling(), LangOptions::ComplexRangeKind::CX_Full); + setComplexRange(D, A->getSpelling(), + LangOptions::ComplexRangeKind::CX_Full, + LastComplexRangeOption, Range); break; case options::OPT_fcomplex_arithmetic_EQ: { LangOptions::ComplexRangeKind RangeVal; @@ -2916,7 +2878,8 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, << A->getSpelling() << Val; break; } - setComplexRange(Args.MakeArgString(A->getSpelling() + Val), RangeVal); + setComplexRange(D, Args.MakeArgString(A->getSpelling() + Val), RangeVal, + LastComplexRangeOption, Range); break; } case options::OPT_ffp_model_EQ: { @@ -2956,8 +2919,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, FPModel = Val; FPContract = "on"; LastFpContractOverrideOption = "-ffp-model=precise"; - setComplexRange(Args.MakeArgString(A->getSpelling() + Val), - LangOptions::ComplexRangeKind::CX_Full); + setComplexRange(D, Args.MakeArgString(A->getSpelling() + Val), + LangOptions::ComplexRangeKind::CX_Full, + LastComplexRangeOption, Range); } else if (Val == "strict") { StrictFPModel = true; FPExceptionBehavior = "strict"; @@ -2966,8 +2930,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, LastFpContractOverrideOption = "-ffp-model=strict"; TrappingMath = true; RoundingFPMath = true; - setComplexRange(Args.MakeArgString(A->getSpelling() + Val), - LangOptions::ComplexRangeKind::CX_Full); + setComplexRange(D, Args.MakeArgString(A->getSpelling() + Val), + LangOptions::ComplexRangeKind::CX_Full, + LastComplexRangeOption, Range); } else D.Diag(diag::err_drv_unsupported_option_argument) << A->getSpelling() << Val; @@ -3174,8 +3139,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, SignedZeros = true; restoreFPContractState(); if (Range != LangOptions::ComplexRangeKind::CX_Full) - setComplexRange(A->getSpelling(), - LangOptions::ComplexRangeKind::CX_None); + setComplexRange(D, A->getSpelling(), + LangOptions::ComplexRangeKind::CX_None, + LastComplexRangeOption, Range); else Range = LangOptions::ComplexRangeKind::CX_None; LastComplexRangeOption = ""; |