First of all, your initializer is not necessarily a constant expression. If a has a local scope, then it is assigned an address at runtime when it hits the stack. C11 6.6 / 7 says that for a pointer to be a constant expression, it must be an address constant, which is defined in 6.6 / 9 as:
The address constant is a null pointer, a pointer to an lvalue designation of an object of static storage duration, or a pointer to a function designation; it must be created explicitly using a unary & operator or integer constant other than the type of the pointer, or implicitly using an expression such as an array or function.
(Emphasis mine)
As for your standard C code, yes it is. Conversions to pointers to integers are allowed, although they can have various forms of poorly defined behavior. Indicated in 6.5 / 6:
Any type of pointer can be converted to an integer type. In addition, as previously indicated, the result is determined by the implementation. If the result cannot be represented in an integer type, the behavior is undefined. The result should not be in the range of values ββof any integer type.
To make sure that the pointer can fit in an integer, you need to use uintptr_t . But I do not think that the pointer to the integer conversion was the reason that you posted this question.
Regarding whether integer overflow will prevent its compile-time constant, I'm not sure where you got this idea from. I do not believe that your reasoning is true, for example (INT_MAX + INT_MAX) - this is a compile-time constant, and it is also guaranteed to overflow. (GCC gives you a warning.) In case of overflow, it causes undefined behavior.
As for why you get errors regarding the fact that the expression is not a compile-time constant, I don't know. I can not play it on gcc 4.9.1. I tried declaring a with both static and automatic storage duration, but no difference.
It looks like you somehow compiled as C90, in which case gcc will tell you: "error: initializer is not computed at boot time". Or maybe there was a compiler error that was fixed in my version of gcc.