- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi all,
When using a generic operator in an extended type, the operator binding is not added to the list from the ' mother' type. The compiler reject the code saying the operation is invalid. If you remove the operator in the extend type, everything is fine.
Also, I'm testing overriding feature, and I do not really understand why function overriding is working but not when using the operator.
Thanks.
module test type :: my_integer integer, private :: value contains procedure,pass :: add_r => add_my_integer_r generic,public :: operator(+) => add_r end type my_integer type, extends(my_integer) :: my_integerr contains procedure,pass :: add_r => add_my_integer_rr procedure,pass :: add_real generic,public :: operator(+) => add_real end type my_integerr contains function add_real(a,b) result(r) class(my_integerr),intent(in) :: a real,intent(in) :: b real :: r r=a%value+4d0*b end function function add_my_integer_rr(a,b) result(r) class(my_integerr),intent(in) :: a integer,intent(in) :: b integer :: r r=a%value+3*b print *,'overriding function' end function function add_my_integer_r(a,b) result(r) class(my_integer),intent(in) :: a integer,intent(in) :: b integer :: r r=a%value+b end function end module test program toto use test class(my_integer),allocatable :: t class(my_integerr),allocatable :: tt type(my_integerr),allocatable :: ttt integer :: a allocate(t,tt,ttt) a=2 print *,'with operator' print *,t+a print *,tt+a print *,ttt+a print *,ttt+2.0 print *,'with function' print *,t%add_r(a) print *,tt%add_r(a) print *,ttt%add_r(a) end program toto
Result in :
test2.f90(47): error #6355: This binary operation is invalid for this data type. [TT]
print *,tt+a
--------^
test2.f90(47): error #6549: An arithmetic or LOGICAL type is required in this context.
print *,tt+a
----------^
test2.f90(48): error #6355: This binary operation is invalid for this data type. [TTT]
print *,ttt+a
--------^
test2.f90(48): error #6549: An arithmetic or LOGICAL type is required in this context.
print *,ttt+a
-----------^
compilation aborted for test2.f90 (code 1)
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Look like it might be an ifort bug regarding 'generic,public :: operator(+) => add_real'. Let me investigate a little bit and I'll get back to you.
Patrick
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm convinced this is an ifort bug regarding recognition of operator(+) for the extended type. The code is standard-conforming Fortran and I don't see anything wrong with it. I've reported this to the developers (internal ID DPD200362489). I'll keep this thread updated with developments.
Patrick
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I ran into another example slightly different but i think it is the same issue. The interface does not add up for a generic operator if a generic binding has alredy been defined. This gives an error for the "t1=t2", the error goes away if you comment the assignment copy in type cm.
module types1 implicit none type cm integer :: i contains procedure,pass(t2) :: copy!_real=>copy_to_int generic,public :: assignment(=) => copy end type cm type cm2 double precision :: j contains procedure,pass(t2) :: to_int => copy_to_int generic,public :: assignment(=) => to_int end type cm2 contains subroutine copy(t1,t2) class(cm),intent(out) ::t1 class(cm),intent(in) ::t2 t1%i=t2%i end subroutine subroutine copy_to_int(t1,t2) class(cm),intent(out) :: t1 class(cm2),intent(in) :: t2 t1%i=int(t2%j) end subroutine subroutine test() class(cm),allocatable :: t1 class(cm2),allocatable :: t2 allocate(t1,t2) t1=t2 end subroutine end module
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The original test case is fixed in the 16.0 compiler, so I am closing this ticket now. I tested this on Windows, but it shouldn't be any different on Linux or Mac. If the outputs are incorrect, please reply.
C:\ISN_Forums\U534286>ifort U534286.f90
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 16.0.0.110 Build 20150815
Copyright (C) 1985-2015 Intel Corporation. All rights reserved.
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation. All rights reserved.
-out:U534286.exe
-subsystem:console
U534286.obj
C:\ISN_Forums\U534286>U534286.exe
with operator
6226006
overriding function
6
overriding function
6
8.000000
with function
6226006
overriding function
6
overriding function
6
C:\ISN_Forums\U534286>

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page