On Thu, Oct 24, 2024 at 10:22:29PM +0200, Thomas Koenig wrote:
>
> > I'll note that match.cc(gfc_match_type_spec) has to deal with
> > REAL as a possible intrinsic function. See the comment
> >
> > /* REAL is a real pain because it can be a type, intrinsic subprogram,
> > or list item in a type-list of an OpenMP reduction clause. Need to
> > differentiate REAL([KIND]=scalar-int-initialization-expr) from
> > REAL(A,[KIND]) and REAL(KIND,A). Logically, when this code was
> > written the use of LOGICAL as a type-spec or intrinsic subprogram
> > was overlooked. */
>
> You're right.
>
> I just looked at the code that matches REAL, and it's... ugh. I could
> copy that, but it would certainly be complicated and error-prone, and
> I would like to avoid that.
Come now, I wrote that code! :-) And, yes, it's ugly.
> @Peter: Based on this, I would really like to stick with UINT, which has
> none of these problems.
>
> > BTW, I haven't checked with code, yet. Do you permit UNSIGNED*4, etc?
> > I would discourage such a declaration.
>
> It is currently not rejected, but this is also something that should
> be done. I'll put it on my to-do list.
>
When I gave gfortran the ability to have a type-spec in an array
constructor, I deliberated choose to only allow standard conforming
type-specs. match.cc(gfc_match_type_spec) was introduced to reject
the *4 notation.
program p
unsigned*4 :: a(2)
a = [unsigned*4 :: 1u, 2u]
print *, a
end
% gfcx -o z a.f90 -funsigned && ./z
a.f90:3:17:
3 | a = [unsigned*4 :: 1u, 2u]
| 1
Error: Invalid type-spec at (1)
The place where you'll need think about rejecting *4 is
in decl.cc(gfc_match_decl_type_spec).
--
Steve