No compiler never detects the error if bounds of an array are exceeded.
That's a double negative. In English, that's the same as "every compiler at least sometimes detects exceeding the bounds of an array." Providing too many initializers may or may not be considered as such.
Anyway, it is forbidden by C11 §6.7.9/2:
No initializer shall attempt to provide a value for an object not contained within the entity being initialized.
and C++11 §8.5.2/2 [dcl.init.string]:
There shall not be more initializers than there are array elements.
However, C and C++ do not require anything besides a message to be printed when your program contains something illegal. The message could be labelled merely as a warning, and the program still compiles and runs. (C++11 §1.4/2; C11 §5.1.1.3/1 and footnote.)
Oddly enough, Clang and GCC mark it as a warning when compiling C and an error for C++. This perhaps reflects something about usage in practice.
Since the declaration looks like an error, it's reasonable to expect at least a warning message from some compiler, and unreasonable to do it on purpose in any case. Why ask the compiler when you know it's wrong?