Here's my opinion: a correct implementation must reduce constant zero
expressions assigned to pointers at compile time.
There are constant expressions, and there are some specific requirements
on those expressions. Among others, when the value of such an expression
is zero, the expression must be convertible to a pointer and result in a
null pointer.
Since you didn't quote it, I'll note that the expression being discussed
is "1<<100", and we're assuming that it's on an implementation in which
type int has 100 or fewer bits.
That's entirely irrelevant though, because the expression in question is
NOT a constant expression with a value of zero -- it's an expression
with undefined behavior. I've already pointed that out in what you've
quoted above. Maybe you don't believe that. In that case, here's what
the standard says (section 5.8/1) [expr.shift]:
The behavior is undefined if the right operand is negative,
or greater than or equal to the length in bits of the
promoted left operand.