GNU bug report logs - #43023
clang++ in a {clang-toolchain + gcc-toolchain} environment

Previous Next

Package: guix;

Reported by: Emmanuel Agullo <emmanuel.agullo <at> inria.fr>

Date: Mon, 24 Aug 2020 15:24:02 UTC

Severity: normal

To reply to this bug, email your comments to 43023 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guix <at> gnu.org:
bug#43023; Package guix. (Mon, 24 Aug 2020 15:24:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Emmanuel Agullo <emmanuel.agullo <at> inria.fr>:
New bug report received and forwarded. Copy sent to bug-guix <at> gnu.org. (Mon, 24 Aug 2020 15:24:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Emmanuel Agullo <emmanuel.agullo <at> inria.fr>
To: bug-guix <at> gnu.org
Subject: clang++ in a {clang-toolchain + gcc-toolchain} environment
Date: Mon, 24 Aug 2020 15:43:57 +0200 (CEST)
[Message part 1 (text/plain, inline)]
Hello, 

A typical "hello world" C++ fails in an environment with both 
`gcc-toolchain' and `clang-toolchain', apperently due to the setup of 
the `CPLUS_INCLUDE_PATH' environment variable (used because of the 
`#include <iostream>' instruction), when compiling with `clang++'. 

I do not know if this is a bug or the expected behaviour. Obviously one 
is not likely to explicitly load an environment with both `gcc-toolchain' 
and `clang-toolchain' but migth do so implictly (and possibly not being 
aware of it) for instance having `gcc-toolchain' globally installed and 
at some point loading `clang-toolchain' in an environment. 

Note that it is not critical at all in practice in my case, and I do 
not know whether it it is desirable to fix it in some way, or, maybe 
mention the incompatibility somewhere 
(<https://guix.gnu.org/manual/en/html_node/Development.html> ?) if not 
already done so – in which case I am sorry for the noise. 

Please find below: 
1. a simplified C++ "hello world" hello.cpp program 
2. an expected g++ behaviour in a `gcc-toolchain' environment 
3. an expected clang++ behaviour in a `clang-toolchain' environment 
4. an environment with both `gcc-toolchain' & `clang-toolchain' 
- 4.1. with an expected behaviour using `g++' 
- 4.2. with an (expected or not?) error using `clang++' 
- 4.3. a (non desirable) fix of the `CPLUS_INCLUDE_PATH' (removing 
`/gnu/store/…/include/c++') 
5. the employed channels if it may help 

Thanks much for the continous development and support, and once 
again sorry for the possible noise if this is a known expected 
behaviour. 

With best regards, 

Emmanuel 


1 simplified (no newline) C++ "hello world" hello.cpp program 
═════════════════════════════════════════════════════════════ 

┌──── 
│ #include <iostream> 
│ 
│ int main() { 
│ std::cout << "Hello World!"; 
│ return 0; 
│ } 
└──── 


2 `gcc-toolchain' environment 
═════════════════════════════ 

┌──── 
│ guix environment -C --ad-hoc gcc-toolchain coreutils grep 
│ env | grep CPLUS_INCLUDE_PATH 
│ g++ hello.cpp 
│ ./a.out 
└──── 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
CPLUS_INCLUDE_PATH=/gnu/store/gsylxn8q06w6y7622nw159f3q1vvcx2i-profile/include/c++:/gnu/store/gsylxn8q06w6y7622nw159f3q1vvcx2i-profile/include 
Hello World! 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 


3 `clang-toolchain' environment 
═══════════════════════════════ 

┌──── 
│ guix environment -C --ad-hoc clang-toolchain coreutils grep 
│ env | grep CPLUS_INCLUDE_PATH 
│ clang++ hello.cpp 
│ ./a.out 
└──── 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
CPLUS_INCLUDE_PATH=/gnu/store/8qlafmilvc0g1yv8lmilpjmps3p4nrmq-profile/include 
Hello World! 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 


4 environment with both `gcc-toolchain' & `clang-toolchain' 
═══════════════════════════════════════════════════════════ 

4.1 compilation with `g++' 
────────────────────────── 

`g++' in an environment with both gcc and clang toolchains is fine: 
┌──── 
│ guix environment -C --ad-hoc gcc-toolchain clang-toolchain coreutils grep 
│ env | grep CPLUS_INCLUDE_PATH 
│ g++ hello.cpp 
│ ./a.out 
└──── 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
CPLUS_INCLUDE_PATH=/gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++:/gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include 
Hello World! 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 


4.2 compilation with `clang++' (FAIL) 
───────────────────────────────────── 

But `clang++' in the same environment (with both gcc and clang 
toolchains) breaks, raising the following error: 
┌──── 
│ guix environment -C --ad-hoc gcc-toolchain clang-toolchain coreutils grep 
│ clang++ hello.cpp 
└──── 

Error obtained during the `clang++ hello.cpp' step: 
┌──── 
│ In file included from hello.cpp:1: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/iostream:39: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/ostream:38: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/ios:39: 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/exception:105:3: error: unknown type name '_GLIBCXX17_DEPRECATED' 
│ _GLIBCXX17_DEPRECATED 
│ ^ 
│ In file included from hello.cpp:1: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/iostream:39: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/ostream:38: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/ios:39: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/exception:147: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/bits/exception_ptr.h:40: 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:126:1: error: unknown type name '_GLIBCXX_NODISCARD' 
│ _GLIBCXX_NODISCARD void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc) 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:128:1: error: unknown type name '_GLIBCXX_NODISCARD' 
│ _GLIBCXX_NODISCARD void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:140:1: error: unknown type name '_GLIBCXX_NODISCARD' 
│ _GLIBCXX_NODISCARD void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:142:1: error: unknown type name '_GLIBCXX_NODISCARD' 
│ _GLIBCXX_NODISCARD void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:174:1: error: unknown type name '_GLIBCXX_NODISCARD' 
│ _GLIBCXX_NODISCARD inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:175:10: error: cannot initialize return object of type 'int *' with an lvalue of type 'void *' 
│ { return __p; } 
│ ^~~ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:176:1: error: unknown type name '_GLIBCXX_NODISCARD' 
│ _GLIBCXX_NODISCARD inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/new:177:10: error: cannot initialize return object of type 'int *' with an lvalue of type 'void *' 
│ { return __p; } 
│ ^~~ 
│ In file included from hello.cpp:1: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/iostream:39: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/ostream:38: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/ios:39: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/exception:148: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/bits/nested_exception.h:40: 
│ In file included from /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/bits/move.h:57: 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:696:27: error: expected unqualified-id 
│ _GLIBCXX20_DEPRECATED("use is_standard_layout && is_trivial instead") 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:696:27: error: expected ')' 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:696:26: note: to match this '(' 
│ _GLIBCXX20_DEPRECATED("use is_standard_layout && is_trivial instead") 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2648:5: error: unknown type name '_GLIBCXX20_CONSTEXPR' 
│ _GLIBCXX20_CONSTEXPR 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2650:5: error: no variable template matches partial specialization 
│ _Require<__not_<__is_tuple_like<_Tp>>, 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2652:31: error: expected ';' at end of declaration 
│ is_move_assignable<_Tp>> 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2653:10: error: unknown type name '_Tp' 
│ swap(_Tp&, _Tp&) 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2653:16: error: unknown type name '_Tp' 
│ swap(_Tp&, _Tp&) 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2654:51: error: use of undeclared identifier '_Tp' 
│ noexcept(__and_<is_nothrow_move_constructible<_Tp>, 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2654:55: error: expected a type 
│ noexcept(__and_<is_nothrow_move_constructible<_Tp>, 
│ ^ 
│ /gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include/c++/type_traits:2653:5: error: C++ requires a type specifier for all declarations 
│ swap(_Tp&, _Tp&) 
│ ^ 
│ fatal error: too many errors emitted, stopping now [-ferror-limit=] 
│ 20 errors generated. 
└──── 


4.3 (non desirable) fix of the `CPLUS_INCLUDE_PATH' (removing `/gnu/store/.../include/c++') 
─────────────────────────────────────────────────────────────────────────────────────────── 

For information, it is possible (but obviously in general not 
desirable) to fix the `CPLUS_INCLUDE_PATH' variable (removing 
`/gnu/store/.../include/c++'), which leads to a correct compilation 
(and execution). 

┌──── 
│ guix environment -C --ad-hoc gcc-toolchain clang-toolchain coreutils grep 
│ export CPLUS_INCLUDE_PATH=/gnu/store/3ka3a9wgx5sk6ac84nldx7ldpxppn29z-profile/include 
│ clang++ hello.cpp 
│ ./a.out 
└──── 

┌──── 
│ Hello World! 
└──── 


5 channels 
══════════ 

┌──── 
│ guix describe --format=channels 
└──── 

┌──── 
│ (list (channel 
│ (name 'guix-hpc) 
│ (url "https://gitlab.inria.fr/guix-hpc/guix-hpc.git") 
│ (commit 
│ "fa87605fe93fb85b02dad9db246299bcf223f2e0")) 
│ (channel 
│ (name 'guix-hpc-non-free) 
│ (url "https://gitlab.inria.fr/guix-hpc/guix-hpc-non-free.git") 
│ (commit 
│ "43d8cb72144a183aa7a93499f9c59ec0f84244b0")) 
│ (channel 
│ (name 'guix) 
│ (url "https://git.savannah.gnu.org/git/guix.git") 
│ (commit 
│ "c6872990b51971922f3064cba54ab752fcdc1559") 
│ (introduction 
│ (make-channel-introduction 
│ "9edb3f66fd807b096b48283debdcddccfea34bad" 
│ (openpgp-fingerprint 
│ "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA"))))) 
└──── 

[Message part 2 (text/html, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#43023; Package guix. (Thu, 22 Oct 2020 08:11:01 GMT) Full text and rfc822 format available.

Message #8 received at 43023 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludovic.courtes <at> inria.fr>
To: Emmanuel Agullo <emmanuel.agullo <at> inria.fr>
Cc: 43023 <at> debbugs.gnu.org
Subject: Re: bug#43023: clang++ in a {clang-toolchain + gcc-toolchain}
 environment
Date: Thu, 22 Oct 2020 10:10:05 +0200
Hi Emmanuel,

Emmanuel Agullo <emmanuel.agullo <at> inria.fr> skribis:

> A typical "hello world" C++ fails in an environment with both
> `gcc-toolchain' and `clang-toolchain', apperently due to the setup of
> the `CPLUS_INCLUDE_PATH' environment variable (used because of the
> `#include <iostream>' instruction), when compiling with `clang++'.

Did you want to have both toolchains in the environment, or was the goal
to use Clang, but GCC just happened to be already there (being the
default toolchain)?

In the latter case, the new ‘--with-c-toolchain’ option may help: it
allows you to select ‘clang-toolchain’ instead of the default GCC tool
chain.  Note “instead of” rather than “in addition to”, which means that
there’s only one tool chain in the environment, so no risk of
interference.

  https://guix.gnu.org/manual/devel/en/html_node/Package-Transformation-Options.html

Now, if you really want the two toolchains in the same environment,
we’ll have to investigate, though I’m not sure it’s even fixable as it
breaks assumptions behind uses of #include_next in libstdc++ and
elsewhere.

Thanks,
Ludo’.




This bug report was last modified 4 years and 327 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.