Skip to content

Commit fcf5154

Browse files
authored
[flang] Fix IsVariable() to be false for procedure pointers (#72577)
The implementation of the predicate evaluate::IsVariable() needs to recognize procedure pointers and return a false result for them.
1 parent 284da04 commit fcf5154

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

flang/include/flang/Evaluate/tools.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ struct IsVariableHelper
5959
}
6060
}
6161
return false;
62+
} else if constexpr (std::is_same_v<T, SomeType>) {
63+
if (std::holds_alternative<ProcedureDesignator>(x.u) ||
64+
std::holds_alternative<ProcedureRef>(x.u)) {
65+
return false; // procedure pointer
66+
} else {
67+
return (*this)(x.u);
68+
}
6269
} else {
6370
return (*this)(x.u);
6471
}

flang/test/Semantics/associated.f90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ subroutine test(assumedRank)
9292
integer, target :: targetIntArr(2)
9393
integer, target :: targetIntCoarray[*]
9494
integer, pointer :: intPointerArr(:)
95+
procedure(objPtrFunc), pointer :: objPtrFuncPointer
9596

9697
!ERROR: Assumed-rank array cannot be forwarded to 'target=' argument
9798
lvar = associated(assumedRank, assumedRank)
@@ -204,6 +205,8 @@ subroutine test(assumedRank)
204205
lvar = associated(intProcPointer1, elementalProc)
205206
!ERROR: POINTER= argument 'intpointervar1' is an object pointer but the TARGET= argument 'intfunc' is not a variable
206207
lvar = associated (intPointerVar1, intFunc)
208+
!ERROR: POINTER= argument 'intpointervar1' is an object pointer but the TARGET= argument 'objptrfuncpointer' is not a variable
209+
lvar = associated (intPointerVar1, objPtrFuncPointer)
207210
!ERROR: In assignment to object pointer 'intpointervar1', the target 'intfunc' is a procedure designator
208211
intPointerVar1 => intFunc
209212
!ERROR: In assignment to procedure pointer 'intprocpointer1', the target is not a procedure or procedure pointer

0 commit comments

Comments
 (0)