Indeed. Ada should in this case generate R = (T)( (basetype)100 + (basetype)X - (basetype)X )
i.e. carry out all arithmetic explicitly in the basetype and only for stores and loads use the subtype. That is indeed required by the language and what is normally generated. It would be valuable to see exactly who generated the bogus operation.