Assignment interfaces with allocatable polymorphic variables in gfortran 5.5.0 & 8.1.0.
Janus Weil
janus@gcc.gnu.org
Fri Sep 7 17:20:00 GMT 2018
Am Fr., 7. Sep. 2018 um 16:36 Uhr schrieb Ethan Beyak <ethanbeyak@gmail.com>:
> Thank you very much for your response. I didn't realize you could put an 'assignment (=)' in a public statement. This'll solve my problem perfectly!
>
> As a follow-up, let's say I did have multiple 'interface assignment (=)' blocks in this module. Would the 'public assignment (=)' statement then make all of assignments public then?
I think so.
> Is there any way I could apply the public attribute to the interface block directly, or am I limited to public statements for affecting the accessibility of interface blocks?
I'm afraid there is no syntax for specifying accessibility in the
INTERFACE statement directly. I have also been missing such a feature
occasionally.
Another thing you could do is to use a type-bound assignment operator, like so:
type vector
real :: x, y, z
contains
procedure :: foo
generic :: assignment(=) => foo
end type vector
However, this approach seems to conflict with the allocatable argument
that you are using in 'foo'. At least that's what gfortran says:
19 | procedure :: foo
| 1
Error: Passed-object dummy argument of ‘foo’ at (1) must not be ALLOCATABLE
> And a brief convention question: is it standard to omit whitespace between 'assignment' and '(=)' when writing Fortran, or is there no general consensus?
You can, but you don't have to. It's a question of personal
preference. I don't think there is any 'general consensus'.
Cheers,
Janus
> On Fri, Sep 7, 2018 at 5:56 AM Janus Weil <janus@gcc.gnu.org> wrote:
>>
>> Hi Ethan,
>>
>> > However, on version 5.5, I get the following errors:
>> >
>> > OUTPUT 2
>> > =========
>> > $ gfortran --version
>> > GNU Fortran (Ubuntu 5.5.0-12ubuntu1) 5.5.0 20171010
>> >
>> > $ gfortran baz_module.f90 test_public_assignment.f90 -o test.out
>> > test_public_assignment.f90:13:0:
>> >
>> > wrk = e ! invoking foo
>> > 1
>> > Error: Assignment to an allocatable polymorphic variable at (1) is not yet
>> > supported
>> > test_public_assignment.f90:19:0:
>>
>> Note that gfortran version 7 can also compile the program in its
>> original form (so you don't necessarily need version 8), but
>> unfortunately earlier versions fail.
>>
>>
>> > Now I did find some workaround by setting the default accessibility of the
>> > module to be public and explicitly declaring the complement of the set of
>> > procedures and variables that I wanted to be private. I'm not sure what
>> > gfortran 5.5.0 is doing to be honest, but the definition of the assignment
>> > can be used in the calling program. Commenting out lines 5,6 and commenting
>> > in lines 8,9 in baz_module.f90 gave me the following output on gfortran
>> > 5.5.0
>> >
>> > OUTPUT 3
>> > =========
>> > Compiler version: GCC version 5.5.0 20171010
>> > Compiler options: -mtune=generic -march=x86-64
>> > d: 4.00000000 2.00000000 1.00000000
>> > e: 8.00000000 6.00000000 4.00000000
>> > f: 32.0000000 18.0000000 8.00000000
>> > =========
>> >
>> > So I have two questions for the gfortran community: 1) do you know why
>> > inverting the module accessibility causes these assignments to work in
>> > gfortran 5.5.0? It seems as if the assignment interface was made public
>> > somehow, but I'm not certain.
>>
>> Exactly, the "public" statement makes everything in the module public
>> by default. The assignment operator is private otherwise.
>>
>>
>> > 2) can you think of any *clean* solutions to
>> > this problem? I'd love backward compatibility while not going against the
>> > recommended standard of private default accessibility.
>>
>> A more reasonable approach might be to not make everything public, but
>> just the assignment interface:
>>
>> public assignment(=)
>>
>> HTH,
>> Janus
More information about the Fortran
mailing list