julia> module Demo
bad(a::AbstractVector{T}) where {T,S} = 1
good(a::AbstractVector{T}) where {T} = 1
end
Main.Demo
julia> detect_unbound_args(Demo)
[1] bad(a::AbstractArray{T,1}) where {T, S} in Main.Demo at REPL[121]:2
From this discussion, I realized that functionality like this should live in a linter, and user who want this are best served by making linting automated and easy to use, possibly as part of CI. You package does exactly this.