Hi, When I tried porting some software (originally written for Windows and now asking for C++14) to MacPorts I was stuck with an external piece of a code written in C, compiled with C++ (I don't fully understand why it is compiled with C++, but I cannot change that).
This is a minimal example that fails: void test(const char *a) {} int main() { test('\0'); // pass an empty string return 0; } A relatively recent clang++ compiler just throws a warning (using libstdc++): > clang++-mp-3.7 test-dev.c clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated test-dev.c:5:10: warning: expression which evaluates to zero treated as a null pointer constant of type 'const char *' [-Wnon-literal-null-conversion] test('\0'); ^~~~ 1 warning generated. But the same compiler in C++11 or C++14 mode throws an error: > clang++-mp-3.7 -stdlib=libc++ -std=c++14 test-dev.c clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated test-dev.c:5:5: error: no matching function for call to 'test' test('\0'); ^~~~ test-dev.c:1:6: note: candidate function not viable: no known conversion from 'char' to 'const char *' for 1st argument void test(const char *a) {} ^ 1 error generated. GCC doesn't seem to care though: > g++-mp-4.9 -std=c++14 test-dev.c > # no warnings or errors I didn't test on Windows. I installed clang 3.5 on Linux (the latest version shipped by Debian-based Mint) and the results were the same as on Mac: > clang++-3.5 -std=c++11 tes-dev.c clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated test-dev.c:4:5: error: no matching function for call to 'test' test('\0'); ^~~~ test-dev.c:1:6: note: candidate function not viable: no known conversion from 'char' to 'const char *' for 1st argument void test(const char *a) {} ^ 1 error generated. > clang++-3.5 test-dev.c clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated test-dev.c:4:10: warning: expression which evaluates to zero treated as a null pointer constant of type 'const char *' [-Wnon-literal-null-conversion] test('\0'); ^~~~ 1 warning generated. I came up with a workaround, defining const char *empty = ""; test(empty); The upstream developers replied: first: > If I'm understanding correctly, it also seems like a bug in the C++ > compiler to think that a character constant is not const, second: > If I understand the patch well, the C code supplies a character \0 > when an empty string is expected. In K&R C it is the same but strictly > checking in C++ they are different things. So I was wondering which compiler was right: g++ or clang++? Mojca _______________________________________________ macports-dev mailing list macports-dev@lists.macosforge.org https://lists.macosforge.org/mailman/listinfo/macports-dev