[FYI] C++ compilers vs. __cplusplus (was Re: SV: Re: make failed for editors/libreoffice)

Jung-uk Kim jkim at FreeBSD.org
Thu Jul 19 19:36:56 UTC 2012


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2012-07-19 15:09:08 -0400, Dimitry Andric wrote:
> On 2012-07-19 20:07, Jung-uk Kim wrote:
>> On 2012-07-19 09:21:30 -0400, Dimitry Andric wrote:
> ...
>> Since when Clang started mimicking GCC 4.7?
> 
> Most likely since somebody attempted to get the latest GNU
> libstdc++ building with clang, and bumped into precisely this
> issue: if __cplusplus has the simple value 1, you can't get
> libstdc++'s C++0x or C++11 support enabled.
> 
> 
>> % /usr/local/bin/clang++ -E -x c++ -dM /dev/null | grep __GNUC 
>> #define __GNUC_GNU_INLINE__ 1 #define __GNUC_MINOR__ 2 #define
>> __GNUC_PATCHLEVEL__ 1 #define __GNUC__ 4
> 
> Yeah, that's probably the last gcc version clang is going to lie
> about, especially since version checking is very fragile.  By the
> way, feature checks are implemented in clang using the
> __has_feature macro, which is much easier to use than comparing
> versions:
> 
> http://clang.llvm.org/docs/LanguageExtensions.html#feature_check

Yes, I know.  Actually, the real problem is LibreOffice treats Clang
as GCC variant and configure script thinks it is gcc 4.2.1:-(

configure:7361: checking the GNU C compiler version
configure:7385: result: checked (gcc 4.2.1)

> ...
>>> Well, this is what you get when standards progress to include 
>>> non-standard features (such as gcc's "__null") that are already
>>> in use, but then subtly change them (calling them "nullptr").
>> 
>> Yes, it is subtle but it can cause a real trouble because NULL
>> can have different types depending on compiler versions and
>> FreeBSD releases.
>> 
>> % cat test.cc #include <cstddef> char *test =
>> reinterpret_cast<char *>(NULL); % clang++ -c test.cc % clang++ -c
>> -std=gnu++98 test.cc % clang++ -c -std=gnu++0x test.cc % clang++
>> -c -std=c++98 test.cc % clang++ -c -std=c++0x test.cc 
>> test.cc:2:14: error: reinterpret_cast from 'nullptr_t' to 'char
>> *' is not allowed char *test = reinterpret_cast<char *>(NULL); 
>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> There is no need for casting at all here.  'nullptr' can implicitly
> be converted to any pointer type.  If you really want to perform
> the cast, even when it is unnecessary, use static_cast<>, or a
> C-style cast.
> 
> You only need to use reinterpret_cast<> here, if you want to
> convert 'nullptr' to any non-pointer type, such as int.

Feel free to file a LibreOffice PR. ;-)

https://www.libreoffice.org/get-help/bug/

Seriously, it is not really easy to correct all upstream bugs,
especially huge monsters such as LibreOffice & OpenOffice. :-(

> Btw, does anybody know *why* the LibreOffice port attempts to
> compile everything as C++0x or C++11?   Is it really using those
> features?

It is using some of its features, I guess:

ifeq ($(HAVE_CXX0X),TRUE)
#Currently, as well as for its own merits, c++11/c++0x mode allows use
to use
#a template for SAL_N_ELEMENTS to detect at compiler time its misuse
gb_CXXFLAGS += -std=c++0x
...

I don't know the impact of turning it off, however.  Some time ago, I
tried to forcefully turning it off but I wasn't able to make it work
on all releases at the time.

Jung-uk Kim
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (FreeBSD)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAlAIYdYACgkQmlay1b9qnVP5wQCgrPWXsR5XwPHw2+4hXUdrt80r
vS8AnRRHfIHWivxEfOnl11BnBIUFN98J
=VdAg
-----END PGP SIGNATURE-----


More information about the freebsd-ports mailing list