[flang] Do not return true for pointer sub-object in IsPointerObject
authorJean Perier <jperier@nvidia.com>
Fri, 11 Mar 2022 08:22:47 +0000 (09:22 +0100)
committerJean Perier <jperier@nvidia.com>
Fri, 11 Mar 2022 08:26:21 +0000 (09:26 +0100)
commita7802a806d5f8dea2038507f4746b661d4e9bf97
tree5689240f50eb9b2b5fdce1ef9984f86bc19b5972
parent3ed643ea765411a3837b6fbb2e6f3b5a6bd616a3
[flang] Do not return true for pointer sub-object in IsPointerObject

evaluate::IsPointerObject used to return true for pointer suboject like
`pointer(10)` while these object are not pointers. This prevented some
checks like 15.5.2.7 to be correctly enforced (e.g., it was possible to
pass `pointer(10)` to a non intent(in) dummy pointer).

After updating IsPointerObject behavior and adding a test for 15.5.2.7 in
call07.f90, a test in call03.f90 for 15.5.2.4(14) was failing.
It appeared the related semantics check was relying on IsPointerObject
to return true for `pointer(10)`. Adapt the code to detect pointer element
in another way.
While looking at the code, I also noticed that semantics was
rejecting `character(1)` pointer/assumed shape suboject when these are
allowed (the standard has a special case for character(1) in
15.5.2.4(14), and I verified that other compilers that enforce 15.5.2.4(14)
do accept this).

Differential Revision: https://reviews.llvm.org/D121377
flang/lib/Evaluate/tools.cpp
flang/lib/Semantics/check-call.cpp
flang/test/Semantics/call03.f90
flang/test/Semantics/call07.f90