<Example Program>

Module type_module
    Type value_type
        Character(Len=8) name
    End Type
    Type, Extends(value_type) :: real_value
        Real x
    End Type
    Type, Extends(value_type) :: integer_value
        Integer v
    End Type
Contains
    Subroutine print(value)
        Class(value_type), Intent(In) :: value
        Write (*,'(A)',Advance='No') &
            '"'//Trim(value%name)//'" is '
       
Select Type (value)
        Class Is (real_value)

            Print *, 'Real',value%x
       
Class Is (integer_value)
            Print *, 'Int',value%v
       
Class Default
            Print *, 'Unrecognised'
       
End Select
    End Subroutine
End Module
Program select_type_example
    Use type_module
    Type(real_value) :: x = real_value('one',17.5)
    Type(integer_value) :: y = integer_value('two',42)
    Type, Extends(value_type) :: logical_value
        Logical x
    End Type
    Type(logical_value) :: z = logical_value('three',.false.)
    Call print(x)
    Call print(y)
    Call print(z)
End


Execution Results

  "one" is Real  17.5000000
  "two" is Int 42
  "three" is Unrecognised