frederick-vs-ja wrote: > While `log` does exist since C89 _within <math.h>_, it should be allowed for > a `.c` to define `int log = 0;` because the `math.h` has not been included. > Thereby, even if `double log(double);` exists in C89 (in `math.h`), it's not > been declared in the current translation unit, so declaring a symbol with the > same name as `log` seems to be valid IMO.
However, declaration it as an object with _external_ linkage is UB (or ill-formed, no diagnostic required in the C++ standard wording). Per [N3220](https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf) 7.1.3/1 > [...] > — All identifiers with external linkage in any of the following subclauses > (including the future library directions) and `errno` are always reserved for > use as identifiers with external linkage.<sup>218)</sup> > [...] In C89 that was in 4.1.2 > [...] All external identifiers declared in any of the headers are reserved, > whether or not the associated header is included. [...] It seem to me that the following program was well-defined in C89 but became undefined (IFNDR) since C99. ```C int logf = 0; /* N.B. static not used */ int main(void) { return logf; } ``` But if `logf` if replaced with `log`, the program is invalid even in C89. https://github.com/llvm/llvm-project/pull/129979 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits