base needs upper bound