[flang-commits] [flang] [Flang] Interface vs explicit intrinsics priority (PR #215355)
via flang-commits
flang-commits at lists.llvm.org
Mon Aug 10 11:02:58 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Ali Bahrani (mrbahrani)
<details>
<summary>Changes</summary>
This PR addresses the issue #<!-- -->212683
I updated `ExpressionAnalyzer::ResolveGeneric` method to prioritize internal interface definition over explicit intrinsic in symbol resolution.
`symbol34.f90` is also added to verify the changes made to the system. The changed flang binary passes both check-flang and check-flang unit.
---
Full diff: https://github.com/llvm/llvm-project/pull/215355.diff
2 Files Affected:
- (modified) flang/lib/Semantics/expression.cpp (+4-4)
- (added) flang/test/Semantics/symbol34.f90 (+40)
``````````diff
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index fc57cc43e981c..6bf1bda749745 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -3204,7 +3204,7 @@ auto ExpressionAnalyzer::ResolveGeneric(const Symbol &symbol,
const Symbol *elemental{nullptr}; // matching elemental specific proc
const Symbol *nonElemental{nullptr}; // matching non-elemental specific
const auto *genericDetails{ultimate.detailsIf<semantics::GenericDetails>()};
- if (genericDetails && !explicitIntrinsic) {
+ if (genericDetails) {
std::optional<CudaMatchingDistance> crtMatchingDistance;
for (const Symbol &specific0 : genericDetails->specificProcs()) {
const Symbol &specific1{BypassGeneric(specific0)};
@@ -3276,12 +3276,12 @@ auto ExpressionAnalyzer::ResolveGeneric(const Symbol &symbol,
// Return the right resolution, if there is one. Explicit intrinsics
// are preferred, then non-elements specifics, then elementals, and
// lastly structure constructors.
- if (explicitIntrinsic) {
- return {explicitIntrinsic, false};
- } else if (nonElemental) {
+ if (nonElemental) {
return {&AccessSpecific(symbol, *nonElemental), false};
} else if (elemental) {
return {&AccessSpecific(symbol, *elemental), false};
+ } else if (explicitIntrinsic) {
+ return {explicitIntrinsic, false};
}
// Check parent derived type
if (const auto *parentScope{symbol.owner().GetDerivedTypeParent()}) {
diff --git a/flang/test/Semantics/symbol34.f90 b/flang/test/Semantics/symbol34.f90
new file mode 100644
index 0000000000000..7ba122a5b74c9
--- /dev/null
+++ b/flang/test/Semantics/symbol34.f90
@@ -0,0 +1,40 @@
+! RUN: %python %S/test_symbols.py %s %flang_fc1
+!DEF: /mod Module
+module mod
+contains
+ !DEF: /mod/internal_definition_sin_real4 PUBLIC (Function) Subprogram REAL(4)
+ !DEF: /mod/internal_definition_sin_real4/r4 ObjectEntity REAL(4)
+ function internal_definition_sin_real4(r4)
+ !REF: /mod/internal_definition_sin_real4/r4
+ real r4
+ !DEF: /mod/internal_definition_sin_real4/internal_definition_sin_real4 ObjectEntity REAL(4)
+ real internal_definition_sin_real4
+ !REF: /mod/internal_definition_sin_real4/internal_definition_sin_real4
+ !REF: /mod/internal_definition_sin_real4/r4
+ internal_definition_sin_real4 = r4+100
+ end function
+end module
+!DEF: /MAIN MainProgram
+program MAIN
+ !REF: /mod
+ use :: mod
+ !DEF: /MAIN/sin ELEMENTAL, INTRINSIC, PURE (Function) Generic
+ intrinsic :: sin
+ !REF: /MAIN/sin
+ interface sin
+ !DEF: /MAIN/internal_definition_sin_real4 (Function) Use REAL(4)
+ procedure :: internal_definition_sin_real4
+ end interface
+ !DEF: /MAIN/a ObjectEntity REAL(4)
+ real a
+ !DEF: /MAIN/b ObjectEntity REAL(8)
+ real(kind=8) b
+ !REF: /MAIN/a
+ !REF: /MAIN/internal_definition_sin_real4
+ a = sin(1.0)
+ !REF: /MAIN/a
+ print *, a
+ !REF: /MAIN/b
+ !REF: /MAIN/sin
+ b = sin(1.0_8)
+end program
``````````
</details>
https://github.com/llvm/llvm-project/pull/215355
More information about the flang-commits
mailing list