upper bound passed as an argument