[flang-commits] [flang] 6f57b64 - [flang][semantics] Clean up -frelaxed-c-loc-checks warning flag handling (#203071)

via flang-commits flang-commits at lists.llvm.org
Wed Jun 10 12:48:08 PDT 2026


Author: Andre Kuhlenschmidt
Date: 2026-06-10T12:48:04-07:00
New Revision: 6f57b648974fb90cc6c495c83596e3022a42c146

URL: https://github.com/llvm/llvm-project/commit/6f57b648974fb90cc6c495c83596e3022a42c146
DIFF: https://github.com/llvm/llvm-project/commit/6f57b648974fb90cc6c495c83596e3022a42c146.diff

LOG: [flang][semantics] Clean up -frelaxed-c-loc-checks warning flag handling (#203071)

When I originally implemented this I was confused about how
LanguageFeature warning flags work. Drop the separate UsageWarning::CLoc
in favour of using LanguageFeature::RelaxedCLocChecks (renamed from
RelaxedCLoc to match the feature flag) as the warning flag directly. The
warning is off by default since the user has already opted into this
extension using the feature flag; use -Wrelaxed-c-loc-checks alongside
-frelaxed-c-loc-checks to opt in. Update the test and docs accordingly.

Added: 
    

Modified: 
    flang/docs/Extensions.md
    flang/include/flang/Support/Fortran-features.h
    flang/lib/Evaluate/intrinsics.cpp
    flang/lib/Frontend/CompilerInvocation.cpp
    flang/lib/Support/Fortran-features.cpp
    flang/test/Semantics/c_loc01-relaxed.f90

Removed: 
    


################################################################################
diff  --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md
index b84b2ac188ff7..0cc9a8230dfb9 100644
--- a/flang/docs/Extensions.md
+++ b/flang/docs/Extensions.md
@@ -567,6 +567,8 @@ end program
   unexpected behavior. This is for compatibility with
   legacy code; legacy code should be updated to be correct.
   This could be removed at any time.
+  Use `-Wrelaxed-c-loc-checks` (alongside `-frelaxed-c-loc-checks`) to
+  enable a diagnostic warning for affected call sites.
   [-frelaxed-c-loc-checks]
 
 ### Extensions and legacy features deliberately not supported

diff  --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h
index 00c43a2879667..a49ecda91603f 100644
--- a/flang/include/flang/Support/Fortran-features.h
+++ b/flang/include/flang/Support/Fortran-features.h
@@ -59,7 +59,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines,
     PointerPassObject, MultipleIdenticalDATA,
     DefaultStructConstructorNullPointer, AssumedRankIoItem,
     MultipleProgramUnitsOnSameLine, AllocatedForAssociated,
-    OpenMPThreadprivateEquivalence, RelaxedCLoc, CudaPinned,
+    OpenMPThreadprivateEquivalence, RelaxedCLocChecks, CudaPinned,
     OpenAccDefaultNoneScalarsStrict, OpenACCMultipleNamesInRoutine)
 
 // Portability and suspicious usage warnings
@@ -86,7 +86,7 @@ ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable,
     RealConstantWidening, VolatileOrAsynchronousTemporary, UnusedVariable,
     UsedUndefinedVariable, BadValueInDeadCode, AssumedTypeSizeDummy,
     MisplacedIgnoreTKR, NamelistParameter, ImpureFinalInPure,
-    IgnoredNoReallocateLHS, CLoc, ExperimentalOption)
+    IgnoredNoReallocateLHS, ExperimentalOption)
 
 using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>;
 using UsageWarnings = EnumSet<UsageWarning, UsageWarning_enumSize>;

diff  --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index ede9eb36e4cad..e18ba12d7678b 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -3515,8 +3515,9 @@ std::optional<SpecificCall> IntrinsicProcTable::Implementation::HandleC_Loc(
         !(IsObjectPointer(*expr) ||
             (IsVariable(*expr) && GetLastTarget(GetSymbolVector(*expr))))) {
       if (context.languageFeatures().IsEnabled(
-              common::LanguageFeature::RelaxedCLoc)) {
-        context.Warn(common::UsageWarning::CLoc, arguments[0]->sourceLocation(),
+              common::LanguageFeature::RelaxedCLocChecks)) {
+        context.Warn(common::LanguageFeature::RelaxedCLocChecks,
+            arguments[0]->sourceLocation(),
             "C_LOC() argument should be a data pointer or target"_warn_en_US);
       } else {
         context.messages().Say(arguments[0]->sourceLocation(),
@@ -3566,7 +3567,7 @@ std::optional<SpecificCall> IntrinsicProcTable::Implementation::HandleC_Loc(
       specificCall.arguments.emplace_back(std::move(arguments[0]));
       return specificCall;
     } else if (context.languageFeatures().IsEnabled(
-                   common::LanguageFeature::RelaxedCLoc)) {
+                   common::LanguageFeature::RelaxedCLocChecks)) {
       if (!expr || !IsProcedurePointer(*expr)) {
         // There are more specific errors as to why the expression doesn't exist
         // or isn't characterizable as a data object or procedure.

diff  --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index a3335fc9a250f..450bfb59b6e8f 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -878,7 +878,7 @@ static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args,
 
   // -frelaxed-c-loc-checks
   if (args.hasArg(clang::options::OPT_relaxed_c_loc)) {
-    opts.features.Enable(Fortran::common::LanguageFeature::RelaxedCLoc);
+    opts.features.Enable(Fortran::common::LanguageFeature::RelaxedCLocChecks);
   }
 
   // -f{no-}openacc-default-none-scalars-strict

diff  --git a/flang/lib/Support/Fortran-features.cpp b/flang/lib/Support/Fortran-features.cpp
index d081cb9a50b57..73bde3ec8d32d 100644
--- a/flang/lib/Support/Fortran-features.cpp
+++ b/flang/lib/Support/Fortran-features.cpp
@@ -140,7 +140,7 @@ LanguageFeatureControl::LanguageFeatureControl() {
   disable_.set(LanguageFeature::ImplicitNoneExternal);
   disable_.set(LanguageFeature::DefaultSave);
   disable_.set(LanguageFeature::SaveMainProgram);
-  disable_.set(LanguageFeature::RelaxedCLoc);
+  disable_.set(LanguageFeature::RelaxedCLocChecks);
   // These features, if enabled, conflict with valid standard usage,
   // so there are disabled here by default.
   disable_.set(LanguageFeature::BackslashEscapes);
@@ -215,7 +215,6 @@ LanguageFeatureControl::LanguageFeatureControl() {
   warnUsage_.set(UsageWarning::MisplacedIgnoreTKR);
   warnUsage_.set(UsageWarning::ImpureFinalInPure);
   warnUsage_.set(UsageWarning::IgnoredNoReallocateLHS);
-  warnUsage_.set(UsageWarning::CLoc);
   warnLanguage_.set(LanguageFeature::OpenMPThreadprivateEquivalence);
   warnLanguage_.set(LanguageFeature::OpenACCMultipleNamesInRoutine);
 }

diff  --git a/flang/test/Semantics/c_loc01-relaxed.f90 b/flang/test/Semantics/c_loc01-relaxed.f90
index 714d4acd5e06f..0b04e2a922af5 100644
--- a/flang/test/Semantics/c_loc01-relaxed.f90
+++ b/flang/test/Semantics/c_loc01-relaxed.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/test_errors.py %s %flang_fc1 -frelaxed-c-loc-checks
+! RUN: %python %S/test_errors.py %s %flang_fc1 -frelaxed-c-loc-checks -Wrelaxed-c-loc-checks
 module m
   use iso_c_binding
   type haslen(L)
@@ -25,9 +25,9 @@ subroutine test(assumedType, poly, nclen, n)
     real :: arr2(purefun2(c_funloc(subr))) ! ok
     character(:), allocatable, target :: deferred
     character(n), pointer :: p2ch
-    !WARNING: C_LOC() argument should be a data pointer or target [-Wc-loc]
+    !WARNING: C_LOC() argument should be a data pointer or target [-Wrelaxed-c-loc-checks]
     cp = c_loc(notATarget)
-    !WARNING: C_LOC() argument should be a data pointer or target [-Wc-loc]
+    !WARNING: C_LOC() argument should be a data pointer or target [-Wrelaxed-c-loc-checks]
     cp = c_loc(pptr)
     !ERROR: C_LOC() argument must be contiguous
     cp = c_loc(arr(1:3:2))
@@ -91,9 +91,9 @@ subroutine test
     procedure(helper), pointer :: pptr
     cp = c_loc(modtarg)    ! ok
     cp = c_loc(localtarg)  ! ok
-    !WARNING: C_LOC() argument should be a data pointer or target [-Wc-loc]
+    !WARNING: C_LOC() argument should be a data pointer or target [-Wrelaxed-c-loc-checks]
     cp = c_loc(notATarget)
-    !WARNING: C_LOC() argument should be a data pointer or target [-Wc-loc]
+    !WARNING: C_LOC() argument should be a data pointer or target [-Wrelaxed-c-loc-checks]
     cp = c_loc(pptr)
   end subroutine
 end module


        


More information about the flang-commits mailing list