https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114526
--- Comment #15 from Joseph S. Myers <jsm28 at gcc dot gnu.org> --- There are several statements such as "Any pointer type may be converted to an integer type." and "A pointer to an object type may be converted to a pointer to a different object type.", that allow certain conversions to occur in a translation unit and are associated with some properties of those conversions if they are executed. There are also statements disallowing certain conversions from occurring in a translation unit (for example, conversions between pointer and floating types are constraint violations). In the cases where there is no statement either way, the behavior is undefined as a property of the translation unit (not just of the execution): it is not defined whether such a conversion may occur in a translation unit, and not defined what the semantics would be on execution if an implementation permits the translation of such a conversion. Being undefined through omission of definition has, as per clause 4, not difference in meaning or emphasis from being explicitly undefined. I'd suggest working with the Undefined Behavior Study Group on making it more explicit for each instance of undefined behavior whether it is a property of the program or of an execution thereof, but if any case seems particularly unclear, filing an issue once the new C standard issue tracker is up and running would probably be reasonable (but it seems likely that such issues would be referred to the UB study group to recommend a resolution just as floating-point issues would likely be referred to the CFP group). It's *not* the case that the same rules apply everywhere, because there are two different kinds of UB depending on whether what's undefined is a property of the program or an execution thereof. Division by zero is obviously UB as a property of an execution, because whether a value is zero is a property of the execution. Different types for the same identifier with external linkage in different translation units is obviously UB as a property of the program (and not widely diagnosed without LTO), as the whole concept of an identifier corresponding to an object with a particular value depends on a globally consistent notion of its type and the UB is about presence of declarations rather than a particular path of execution. In some cases, as here, it may be less obvious how to read the wording as referring to properties of an execution or of a program.