I have reduced the gcc (4.8.1) bug to the following:
#include <array>
using Ar = std::array<unsigned long, 10>;
template<typename T>
constexpr T Apply(const T& in, T (*f)(const T&)) { return f(in); }
#if 1 // if disable, bug occurs
// error: expression 'id' does not designate a constexpr function
template<>
constexpr Ar Apply<Ar>(const Ar& in, Ar (*f)(const Ar&)) { return f(in); }
#endif
constexpr Ar ApplyAr(const Ar& in, Ar (*f)(const Ar&)) { return f(in); }
static constexpr Ar id(const Ar& line) { return line; }
static constexpr Ar ar1 = {{1}};
static constexpr Ar results1 = Apply<Ar>(ar1, &id); // Fail when #if 0
static constexpr Ar results2 = ApplyAr(ar1, &id);
static constexpr Ar results3 = id(ar1);
int main() {
return 0;
}