diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 20fb47237c56f..377509cfcf2cd 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -520,6 +520,9 @@ def warn_drv_math_errno_enabled_after_veclib: Warning< "math errno enabled by '%0' after it was implicitly disabled by '%1'," " this may limit the utilization of the vector library">, InGroup; +def warn_drv_gcc_incompatible_complex_range_override: Warning< + "combination of '%0' and '%1' results in complex number calculations incompatible with GCC">, + InGroup; def note_drv_command_failed_diag_msg : Note< "diagnostic msg: %0">; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 1d11be1d82be8..244c4c0848aa6 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2915,6 +2915,11 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, } else { if (GccRangeComplexOption != "-fno-cx-limited-range") EmitComplexRangeDiag(D, GccRangeComplexOption, "-fcx-limited-range"); + // Warn about complex range option overrides incompatible with GCC. + if (GccRangeComplexOption == "-fcx-fortran-rules" || + GccRangeComplexOption == "-fno-cx-fortran-rules") + D.Diag(clang::diag::warn_drv_gcc_incompatible_complex_range_override) + << GccRangeComplexOption << A->getSpelling(); } GccRangeComplexOption = "-fcx-limited-range"; LastComplexRangeOption = A->getSpelling(); @@ -2929,6 +2934,10 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, GccRangeComplexOption != "-fno-cx-fortran-rules") EmitComplexRangeDiag(D, GccRangeComplexOption, "-fno-cx-limited-range"); + // Warn about complex range option overrides incompatible with GCC. + if (GccRangeComplexOption == "-fcx-fortran-rules") + D.Diag(clang::diag::warn_drv_gcc_incompatible_complex_range_override) + << GccRangeComplexOption << A->getSpelling(); } GccRangeComplexOption = "-fno-cx-limited-range"; LastComplexRangeOption = A->getSpelling(); @@ -3231,6 +3240,11 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, case options::OPT_ffast_math: applyFastMath(true); LastComplexRangeOption = A->getSpelling(); + // Warn about complex range option overrides incompatible with GCC. + if (GccRangeComplexOption == "-fcx-fortran-rules" || + GccRangeComplexOption == "-fno-cx-fortran-rules") + D.Diag(clang::diag::warn_drv_gcc_incompatible_complex_range_override) + << GccRangeComplexOption << A->getSpelling(); if (A->getOption().getID() == options::OPT_Ofast) LastFpContractOverrideOption = "-Ofast"; else @@ -3255,6 +3269,11 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, Range != LangOptions::ComplexRangeKind::CX_Full) EmitComplexRangeDiag(D, LastComplexRangeOption, "-fno-fast-math"); Range = LangOptions::ComplexRangeKind::CX_None; + // Warn about complex range option overrides incompatible with GCC. + if (GccRangeComplexOption == "-fcx-fortran-rules" || + GccRangeComplexOption == "-fcx-limited-range") + D.Diag(clang::diag::warn_drv_gcc_incompatible_complex_range_override) + << GccRangeComplexOption << A->getSpelling(); LastComplexRangeOption = ""; GccRangeComplexOption = ""; LastFpContractOverrideOption = ""; diff --git a/clang/test/Driver/range.c b/clang/test/Driver/range.c index 30140f3c208e0..d86bec46589a1 100644 --- a/clang/test/Driver/range.c +++ b/clang/test/Driver/range.c @@ -255,6 +255,31 @@ // RUN: %clang -### -Werror --target=x86_64 -fno-fast-math -ffp-model=strict \ // RUN: -c %s 2>&1 | FileCheck --check-prefixes=FULL %s + +// Test incompatibility of complex range override with GCC 14.2.0. + +// RUN: %clang -### --target=x86_64 -fcx-limited-range -fno-fast-math \ +// RUN: -c %s 2>&1 | FileCheck --check-prefixes=WARN_INCOMPAT1 %s + +// RUN: %clang -### --target=x86_64 -fcx-fortran-rules -fcx-limited-range \ +// RUN: -c %s 2>&1 | FileCheck --check-prefixes=WARN_INCOMPAT2 %s + +// RUN: %clang -### --target=x86_64 -fcx-fortran-rules -fno-cx-limited-range \ +// RUN: -c %s 2>&1 | FileCheck --check-prefixes=WARN_INCOMPAT3 %s + +// RUN: %clang -### --target=x86_64 -fcx-fortran-rules -ffast-math \ +// RUN: -c %s 2>&1 | FileCheck --check-prefixes=WARN_INCOMPAT4 %s + +// RUN: %clang -### --target=x86_64 -fcx-fortran-rules -fno-fast-math \ +// RUN: -c %s 2>&1 | FileCheck --check-prefixes=WARN_INCOMPAT5 %s + +// RUN: %clang -### --target=x86_64 -fno-cx-fortran-rules -fcx-limited-range \ +// RUN: -c %s 2>&1 | FileCheck --check-prefixes=WARN_INCOMPAT6 %s + +// RUN: %clang -### --target=x86_64 -fno-cx-fortran-rules -ffast-math \ +// RUN: -c %s 2>&1 | FileCheck --check-prefixes=WARN_INCOMPAT7 %s + + // WARN1: warning: overriding '-fcx-limited-range' option with '-fcx-fortran-rules' [-Woverriding-option] // WARN2: warning: overriding '-fno-cx-limited-range' option with '-fcx-fortran-rules' [-Woverriding-option] // WARN3: warning: overriding '-fcx-fortran-rules' option with '-fno-cx-limited-range' [-Woverriding-option] @@ -281,4 +306,12 @@ // CHECK-NOT: -complex-range=improved // RANGE-NOT: -complex-range= +// WARN_INCOMPAT1: warning: combination of '-fcx-limited-range' and '-fno-fast-math' results in complex number calculations incompatible with GCC [-Wgcc-compat] +// WARN_INCOMPAT2: warning: combination of '-fcx-fortran-rules' and '-fcx-limited-range' results in complex number calculations incompatible with GCC [-Wgcc-compat] +// WARN_INCOMPAT3: warning: combination of '-fcx-fortran-rules' and '-fno-cx-limited-range' results in complex number calculations incompatible with GCC [-Wgcc-compat] +// WARN_INCOMPAT4: warning: combination of '-fcx-fortran-rules' and '-ffast-math' results in complex number calculations incompatible with GCC [-Wgcc-compat] +// WARN_INCOMPAT5: warning: combination of '-fcx-fortran-rules' and '-fno-fast-math' results in complex number calculations incompatible with GCC [-Wgcc-compat] +// WARN_INCOMPAT6: warning: combination of '-fno-cx-fortran-rules' and '-fcx-limited-range' results in complex number calculations incompatible with GCC [-Wgcc-compat] +// WARN_INCOMPAT7: warning: combination of '-fno-cx-fortran-rules' and '-ffast-math' results in complex number calculations incompatible with GCC [-Wgcc-compat] + // ERR: error: unsupported argument 'foo' to option '-fcomplex-arithmetic='