Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion flang/docs/Extensions.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,13 @@ end
Note that internally the main program symbol name is all uppercase, unlike
the names of all other symbols, which are usually all lowercase. This
may make a difference in testing/debugging.
* A `PROCEDURE()` with no interface name or type may be called as an
subroutine with an implicit interface, F'2023 15.4.3.6 paragraph 4 and
C1525 notwithstanding.
This is a universally portable feature, and it also applies to
`PROCEDURE(), POINTER, NOPASS` derived type components.
Such procedures may *not* be referenced as implicitly typed functions
without first being associated with a function pointer.

## Extensions, deletions, and legacy features supported by default

Expand Down Expand Up @@ -954,4 +961,3 @@ print *, [(j,j=1,10)]
"&GRP A(1:)=1. 2. 3./".
This extension is necessarily disabled when the type of the array
has an accessible defined formatted READ subroutine.

19 changes: 12 additions & 7 deletions flang/lib/Semantics/resolve-names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9435,13 +9435,18 @@ bool ResolveNamesVisitor::SetProcFlag(
SayWithDecl(name, symbol,
"Implicit declaration of function '%s' has a different result type than in previous declaration"_err_en_US);
return false;
} else if (symbol.has<ProcEntityDetails>()) {
symbol.set(flag); // in case it hasn't been set yet
if (flag == Symbol::Flag::Function) {
ApplyImplicitRules(symbol);
}
if (symbol.attrs().test(Attr::INTRINSIC)) {
AcquireIntrinsicProcedureFlags(symbol);
} else if (const auto *proc{symbol.detailsIf<ProcEntityDetails>()}) {
if (IsPointer(symbol) && !proc->type() && !proc->procInterface()) {
// PROCEDURE(), POINTER -- errors will be emitted later about a lack
// of known characteristics if used as a function
} else {
symbol.set(flag); // in case it hasn't been set yet
if (flag == Symbol::Flag::Function) {
ApplyImplicitRules(symbol);
}
if (symbol.attrs().test(Attr::INTRINSIC)) {
AcquireIntrinsicProcedureFlags(symbol);
}
}
} else if (symbol.GetType() && flag == Symbol::Flag::Subroutine) {
SayWithDecl(
Expand Down
8 changes: 4 additions & 4 deletions flang/test/Semantics/resolve09.f90
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,11 @@ subroutine s9
procedure(), nopass, pointer :: p1, p2
end type
type(t) x
!ERROR: Function result characteristics are not known
print *, x%p1()
call x%p2
!ERROR: Cannot call function 'p1' like a subroutine
call x%p1
!ERROR: Cannot call subroutine 'p2' like a function
call x%p2 ! ok
call x%p1 ! ok
!ERROR: Function result characteristics are not known
print *, x%p2()
end subroutine

Expand Down