I want to propose to make the standard range function only take one parameter, end, and derive start from Zero::zero, like Python allows too (though they have a signature like range([start,] end, [step])).
This is the most common case, 5x as often as the variant with start != 0, at least for the compiler and the standard libs. I myself haven’t needed the start parameter once so far.
In addition to being more ergonomic to use (IMO) this also helps for custom indexing types.
for i in range(upper_bound()) {}
as opposed to
for i in range(CustomIndexType(0), upper_bound()) {}.
Of course we should still retain the current range function, perhaps under a different name.