MODULE mytypes IMPLICIT none TYPE pvar character(len=20) :: name integer :: level end TYPE pvar interface operator (==) module procedure pvar_eq end interface contains function pvar_eq(a,b) implicit none class(*), intent(in) ::a,b logical ::pvar_eq if (.not. same_type_as (a, b)) then pvar_eq = .false. return end if select type (a) type is (pvar) select type (b) type is (pvar) print *, "a & b are type pvar" if((a%level.eq. b%level) .and. (a%name .eq. b%name)) then pvar_eq = .true. else pvar_eq = .false. end if end select class default print *, "class default: returning false" pvar_eq = .false. end select end function pvar_eq end MODULE mytypes program test_eq use mytypes implicit none type(pvar) x, y x = pvar('test 1', 100) y = pvar('test 1', 100) write(*, *) x == y x = pvar('test 1', 100) y = pvar('test 2', 100) write(*, *) x == y end program test_eq