https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114526
--- Comment #19 from Kaz Kylheku <kkylheku at gmail dot com> --- (In reply to Harald van Dijk from comment #18) > (In reply to Kaz Kylheku from comment #17) > > The standrad does not define the conversion at the *type* level. > > ... > > The program is strictly conforming because it has no problem with type. > > The DRs I referenced include ones where type errors have explicitly been > stated not to render behaviour undefined. > > DR 132 (C90): > > /* No headers included */ > int checkup() > { > /* Case 1 */ > if (0) > printf("Printing.\n"); > /* Case 2 */ > return 2 || 1 / 0; > } > > Response: "The Response to Defect Report #109 addresses this issue. The > translation unit must be successfully translated." Note that this report response does not say that the translation unit must also be successfully linked, in a hosted implementation, to produce a program. > This, despite the fact that it implicitly declares as int(*)(), which is > incompatible with the type it is meant to be declared as. A mismatch, in linkage, can only occur when a reference is of a different type from the definition. In this translation unit alone, there is no type mismatch, because the unit contains only a reference to printf, and no definition. The translation unit can be part of a program where it makes sense. E.g. in a freestanding implementation, where there isn't a library with a printf, another translation unit can supply a compatible definition of printf. Then, if (0) can be flipped to if (1) and checkup() can be called, even. There is no type problem here whatsoever that is comparable to an operator being given operands whose type combination is not defined for the operator. That's a problem entirely confined in translation phase 7; it cannot be rescued by adding a suitable secondary translation unit. A call to an implicitly declared printf is translatable. There are requirements about every aspect of it. There are no requiremnts about how to translate (void *) &fn.