On Sat, 2018-12-01 at 22:14 +0100, Kamil Rytarowski wrote: > We define a fallback version of __func__ for pre-C99 compilers in > <sys/cdefs.h> > > 416 /* > 417 * C99 defines __func__ predefined identifier, which was made available > 418 * in GCC 2.95. > 419 */ > 420 #if !(__STDC_VERSION__ >= 199901L) > 421 #if __GNUC_PREREQ__(2, 6) > 422 #define __func__ __PRETTY_FUNCTION__ > 423 #elif __GNUC_PREREQ__(2, 4) > 424 #define __func__ __FUNCTION__ > 425 #else > 426 #define __func__ "" > 427 #endif > 428 #endif /* !(__STDC_VERSION__ >= 199901L) */ > > -- https://nxr.netbsd.org/xref/src/sys/sys/cdefs.h#416 > > __func__ has been imported into C++11 along with the C99 compatibility > support and I believe that by accident we redefine it for all C++ programs. > > According to C++ papers, __func__ is an implementation-defined string. > > -- http://eel.is/c++draft/dcl.dcl#dcl.fct.def.general-8 > > However the current version causes a mismatch between NetBSD and the world: > > $ cat test.cc > #include <stdio.h> > int > main(int argc, char **argv) > { > printf("%s\n", __func__); > return 0; > } > $ ./a.out > int main(int, char **) > > vs others: > > $ cat test.cc > #include <stdio.h> > int > main(int argc, char **argv) > { > printf("%s\n", __func__); > return 0; > } > $ ./a.out > main > > The same behavior is presented in G++ and Clang++. > > While both versions are compliant with C++11, this causes unnecessary > difference in regression tests, in particular in the LLVM project. > > I wrote a patch to stop redefining __func__ for C++11, analogous to the > existing logic for C99. > > http://netbsd.org/~kamil/patch-00076-__func__-cpp11.txt > > I've found that a similar issue was also detected at least in fish shell > and developers mentioned the NetBSD case in the thread. > > https://github.com/fish-shell/fish-shell/commit/574851f092358f5834afb0b529676924fcbd59c6 > > I've discussed this with Michal, who has detected the issue in the LLVM > regression tests (https://reviews.llvm.org/D55162) and he has a > different opinion on __func__ and C++. I will let him explain it here. Actually, I misread your patch and now that I read it the second time, I agree with it. Sorry for the trouble ;-). -- Best regards, Michał Górny
Attachment:
signature.asc
Description: This is a digitally signed message part