If a function contains a block-scope object of static
or thread storage duration that has been destroyed
and the function is called
during the destruction of an object with static or thread storage duration,
the program has undefined behavior if the flow of control
passes through the definition of the previously destroyed block-scope object
. Likewise, the behavior is undefined if the block-scope object
is used indirectly (i.e., through a pointer) after its destruction
.