The problem is the output of the argument: the second argument of the template is std::arraynot int, therefore, the output is not executed because it requires conversion.
You must define your method as
template <array<int, 0>::size_type N> void fill_with_magic(array<int, N>& whatever){
for(int i = 0; i < N; i++){
whatever[i] = magic(i, N);
}
}
, array<int,0>::size_type , . , , size_t, ( std::array<T, 0> ).