(address . bug-guix@gnu.org)
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
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)
? (commit
? "fa87605fe93fb85b02dad9db246299bcf223f2e0"))
? (channel
? (name 'guix-hpc-non-free)
? (commit
? "43d8cb72144a183aa7a93499f9c59ec0f84244b0"))
? (channel
? (name 'guix)
? (commit
? "c6872990b51971922f3064cba54ab752fcdc1559")
? (introduction
? (make-channel-introduction
? "9edb3f66fd807b096b48283debdcddccfea34bad"
? (openpgp-fingerprint
? "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA")))))
?????