That might be reasonable. I think my main concern would be that coherence checking might turn into this very fuzzy or very complex process, where you can’t predict what’s going to pass, and/or it depends on which particular compiler version you use. I’d really like to see it spelled out explicitly what is or isn’t “too sophisticated to analyze”.
I’ll admit, I’d forgotten about pointers/reference parameters, in part because I’ve never felt that they were useful except perhaps in very niche situations. The case I’ve seen most often is parameterization by pointer-to-member, which of course Rust doesn’t even have. (Of course, Rust doesn’t have what C++ lables “enums” either, but something far more general.) It’s a fair point that C++ does allow other types, but integers seem to get the most use by far…
To answer your broader question, I don’t know of any cases that are integer-only right now, but several systems started with dependence on integers and later grew to encompass other types. E.g. I think that Dependent ML only had dependence on integers.
Also, a huge range of systems have had special built-in types that are parameterized by integers. E.g. Rust’s [T; N] arrays, and there are the aforementioned Ada range/mod types. Of course that’s not the same thing as having a truly general type dependence, but integers do seem to be the “gateway drug” for type dependence.
(Actually, I was mistaken. I just remembered that I do know of at least one language that’s still being developed and used, and which has integer-only dependent types. Fortran! But that’s hardly a good model. E.g. in Fortran 2003, which was influenced by C++, you can define a type that’s parameterized by a compile-time constant (confusingly enough, constant parameters are called “kinds”, which is completely unrelated to what the word “kind” means in other languages). But you can’t define a function that’s parameterized by an integer, so this does not actually save you much of the effort that generic programming is supposed to help with. They’ve been batting around the idea of parameterizing functions and modules for at least a decade now, but Fortran is not exactly a cutting-edge language, to understate horribly.)
I do like DataKinds, though I think it would take some thought to put a similar system into Rust. I guess that the main reason I wasn’t thinking of GHC as a good “precedent” is because there are such big gaps between the two regarding the type system in general (e.g. Rust still lacks HKT).
Anyway, I’m trying to put together my own version of an RFC for at least the integer part. It will be big and preliminary, but I should have something soon.