all types
   elementary
         scalar
               discrete
                  enumeration
                     character
                     boolean
                     other enumeration
                  integer
                     signed integer
                     modular integer
               real
                  floating point
                  fixed point
                     ordinary fixed point
                     decimal fixed point
         access
               access-to-object
               access-to-subprogram
   composite
         untagged
               array
                  string
                  other array
               record
               task
               protected
         tagged (including interfaces)
               nonlimited tagged record
               limited tagged
                  limited tagged record
                  synchronized tagged
                     tagged task
                     tagged protected