[flang-commits] [PATCH] D140148: [flang] Enforce C1529 as a warning, C919 as an error
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Thu Dec 15 11:57:33 PST 2022
klausler created this revision.
klausler added a reviewer: clementval.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
Constraint C1529 requires that the base object of a type-bound procedure
reference be a scalar if the TBP has the NOPASS attribute. Most
compilers do not enforce this constraint and it does not appear to
have any implementation justification, so emit portability warning.
On the other hand, we fail to enforce C919 for references to
procedure pointer components, whose base objects must of course
be scalars in order to avoid ambiguity and empty arrays, whether
NOPASS is present or not.
https://reviews.llvm.org/D140148
Files:
flang/docs/Extensions.md
flang/lib/Semantics/expression.cpp
flang/test/Semantics/bindings01.f90
Index: flang/test/Semantics/bindings01.f90
===================================================================
--- flang/test/Semantics/bindings01.f90
+++ flang/test/Semantics/bindings01.f90
@@ -215,6 +215,24 @@
end subroutine
end module m7
+module m8 ! C1529 - warning only
+ type t
+ procedure(mysubr), pointer, nopass :: pp
+ contains
+ procedure, nopass :: tbp => mysubr
+ end type
+ contains
+ subroutine mysubr
+ end subroutine
+ subroutine test
+ type(t) a(2)
+ !PORTABILITY: Base of NOPASS type-bound procedure reference should be scalar
+ call a%tbp
+ !ERROR: Base of procedure component reference must be scalar
+ call a%pp
+ end subroutine
+end module
+
program test
use m1
type,extends(t) :: t2
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -2093,6 +2093,19 @@
if (dataRef && !CheckDataRef(*dataRef)) {
return std::nullopt;
}
+ if (dataRef && dataRef->Rank() > 0) {
+ if (sym->has<semantics::ProcBindingDetails>() &&
+ sym->attrs().test(semantics::Attr::NOPASS)) {
+ // C1529 seems unnecessary and most compilers don't enforce it.
+ AttachDeclaration(
+ Say(sc.component.source,
+ "Base of NOPASS type-bound procedure reference should be scalar"_port_en_US),
+ *sym);
+ } else if (IsProcedurePointer(*sym)) { // C919
+ Say(sc.component.source,
+ "Base of procedure component reference must be scalar"_err_en_US);
+ }
+ }
if (const Symbol *resolution{
GetBindingResolution(dtExpr->GetType(), *sym)}) {
AddPassArg(arguments, std::move(*dtExpr), *sym, false);
Index: flang/docs/Extensions.md
===================================================================
--- flang/docs/Extensions.md
+++ flang/docs/Extensions.md
@@ -250,6 +250,12 @@
* A type-bound procedure binding can be passed as an actual
argument corresponding to a dummy procedure and can be used as
the target of a procedure pointer assignment statement.
+* An explicit `INTERFACE` can declare the interface of a
+ procedure pointer even if it is not a dummy argument.
+* A `NOPASS` type-bound procedure binding is required by C1529
+ to apply only to a scalar data-ref, but most compilers don't
+ enforce it and the constraint is not necessary for a correct
+ implementation.
### Extensions supported when enabled by options
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140148.483281.patch
Type: text/x-patch
Size: 2618 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20221215/e8b56e03/attachment-0001.bin>
More information about the flang-commits
mailing list