impl non-trivial types