[flang-commits] [flang] [Flang] Fix for the spurious error for VOLATILE actual argument in implicit interface CALL (PR #192605)
via flang-commits
flang-commits at lists.llvm.org
Fri Apr 17 00:20:06 PDT 2026
https://github.com/ejose02 created https://github.com/llvm/llvm-project/pull/192605
Fixes #191343
Replaced the error with warning. Now it permits calling an external procedure with implicit interface and passing a volatile argument. There will be a warning that the procedure should have an explicit interface. Updated 2 test cases to reflect the change.
>From d9b9737ccf163adc90fe8925c0e991ed131132ea Mon Sep 17 00:00:00 2001
From: ejose02 <ejose at amd.com>
Date: Fri, 17 Apr 2026 12:44:06 +0530
Subject: [PATCH] Fixes #191343
Replaced the error with warning. Now it permits calling an external procedure with implicit interface and passing a volatile argument. There will be a warning that the procedure should have an explicit interface. Updated 2 test cases to reflect the change.
---
flang/lib/Semantics/check-call.cpp | 10 ++++++----
flang/lib/Support/Fortran-features.cpp | 1 +
flang/test/Semantics/call13.f90 | 8 ++++++++
flang/test/Semantics/generic11.f90 | 1 +
4 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp
index 2dd47508a0b3f..a400f001f731d 100644
--- a/flang/lib/Semantics/check-call.cpp
+++ b/flang/lib/Semantics/check-call.cpp
@@ -76,13 +76,15 @@ static void CheckImplicitInterfaceArg(evaluate::ActualArgument &arg,
}
const Symbol &symbol{GetAssociationRoot(resolved)};
if (symbol.attrs().test(Attr::ASYNCHRONOUS)) {
- messages.Say(
- "ASYNCHRONOUS argument '%s' requires an explicit interface"_err_en_US,
+ messages.Warn(/*inModuleFile=*/false, context.languageFeatures(),
+ common::UsageWarning::ImplicitInterfaceActual,
+ "Procedure with ASYNCHRONOUS argument '%s' should have an explicit interface"_warn_en_US,
expr->AsFortran());
}
if (symbol.attrs().test(Attr::VOLATILE)) {
- messages.Say(
- "VOLATILE argument '%s' requires an explicit interface"_err_en_US,
+ messages.Warn(/*inModuleFile=*/false, context.languageFeatures(),
+ common::UsageWarning::ImplicitInterfaceActual,
+ "Procedure with VOLATILE argument '%s' should have an explicit interface"_warn_en_US,
expr->AsFortran());
}
if (const auto *object{symbol.detailsIf<ObjectEntityDetails>()}) {
diff --git a/flang/lib/Support/Fortran-features.cpp b/flang/lib/Support/Fortran-features.cpp
index 4201f0b9b1e49..9d634af98b6ee 100644
--- a/flang/lib/Support/Fortran-features.cpp
+++ b/flang/lib/Support/Fortran-features.cpp
@@ -156,6 +156,7 @@ LanguageFeatureControl::LanguageFeatureControl() {
warnUsage_.set(UsageWarning::HostAssociatedIntentOutInSpecExpr);
warnUsage_.set(UsageWarning::NonVolatilePointerToVolatile);
warnUsage_.set(UsageWarning::RealConstantWidening);
+ warnUsage_.set(UsageWarning::ImplicitInterfaceActual);
// New warnings, on by default
warnLanguage_.set(LanguageFeature::SavedLocalInSpecExpr);
warnLanguage_.set(LanguageFeature::NullActualForAllocatable);
diff --git a/flang/test/Semantics/call13.f90 b/flang/test/Semantics/call13.f90
index 90e19180f9c56..4197de9a381e0 100644
--- a/flang/test/Semantics/call13.f90
+++ b/flang/test/Semantics/call13.f90
@@ -7,6 +7,10 @@ subroutine s(assumedRank, coarray, class, classStar, typeStar)
end type
real :: assumedRank(..), coarray[*]
+ real :: volatileVar
+ volatile :: volatileVar
+ real :: asyncVar
+ asynchronous :: asyncVar
class(t) :: class
class(*) :: classStar
type(*) :: typeStar
@@ -24,6 +28,10 @@ subroutine s(assumedRank, coarray, class, classStar, typeStar)
call implicit11(assumedRank) ! 15.4.2.2(3)(c)
call implicit12(coarray) ! ok
call implicit12a(coarray[1]) ! ok
+ !WARNING: Procedure with VOLATILE argument 'volatilevar' should have an explicit interface [-Wimplicit-interface-actual]
+ call implicit12b(volatileVar)
+ !WARNING: Procedure with ASYNCHRONOUS argument 'asyncvar' should have an explicit interface [-Wimplicit-interface-actual]
+ call implicit12c(asyncVar)
!ERROR: Parameterized derived type actual argument requires an explicit interface
call implicit13(pdtx) ! 15.4.2.2(3)(e)
call implicit14(class) ! ok
diff --git a/flang/test/Semantics/generic11.f90 b/flang/test/Semantics/generic11.f90
index 14383ab150fe4..7db8cc4866942 100644
--- a/flang/test/Semantics/generic11.f90
+++ b/flang/test/Semantics/generic11.f90
@@ -16,6 +16,7 @@ subroutine sub2(rfun)
real rfun
complex zfun
external ifun, rfun, zfun, xfun
+!WARNING: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'ifun=' which has an explicit interface [-Wimplicit-interface-actual]
call sub(ifun)
call sub(rfun)
!ERROR: No specific subroutine of generic 'sub' matches the actual arguments
More information about the flang-commits
mailing list