[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
Sat Dec 17 09:11:17 PST 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG98eb7d0a8d0b: [flang] Enforce C1529 as a warning, C919 as an error (authored by klausler).
Changed prior to commit:
https://reviews.llvm.org/D140148?vs=483281&id=483756#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140148/new/
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
@@ -2103,10 +2103,18 @@
if (dataRef && !CheckDataRef(*dataRef)) {
return std::nullopt;
}
- if (dataRef && dataRef->Rank() > 0 && sym->attrs().test(semantics::Attr::NOPASS)) {
- // C1529 seems unnecessary and most compilers don't enforce it.
- Say(sc.component.source,
- "Base of procedure component reference should be scalar when NOPASS component or binding '%s' is referenced"_port_en_US, sc.component.source);
+ 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)}) {
Index: flang/docs/Extensions.md
===================================================================
--- flang/docs/Extensions.md
+++ flang/docs/Extensions.md
@@ -252,6 +252,10 @@
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.483756.patch
Type: text/x-patch
Size: 2785 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20221217/ac836aff/attachment-0001.bin>
More information about the flang-commits
mailing list