Opened 5 years ago

Closed 4 years ago

#13472 closed Bugs (obsolete)

Bad feature detection for nvcc and clang as a host compiler.

Reported by: Jakub Klener <jakub.klener@…> Owned by: John Maddock
Milestone: To Be Determined Component: config
Version: Boost 1.58.0 Severity: Problem
Keywords: clang nvcc Cc:

Description

Boost feature detection is wrong if the source is compiled with nvcc and clang as host compiler.

For example, move semantics can't be used with c++11 enabled.

#include <utility>                                                                                                                                                                                            

#include <boost/variant.hpp>                                                                                                                                                                                  

class TestClass                                                                                                                                                                                               
{                                                                                                                                                                                                             
public:                                                                                                                                                                                                       
    TestClass() = default;                                                                                                                                                                                    
    TestClass(const TestClass &) = delete;                                                                                                                                                                    
    TestClass(TestClass &&) = default;                                                                                                                                                                        
};                                                                                                                                                                                                            


int main() {                                                                                                                                                                                                  
    TestClass c1;                                                                                                                                                                                             
    boost::variant<TestClass> v{std::move(c1)};                                                                                                                                                               
    return 0;                                                                                                                                                                                                 
}        

When compiled with (ubuntu 16.04, gcc 5.4, CUDA 9.1):

nvcc temp.cu -o temp -ccbin=/usr/bin/gcc -std=c++11

everything works well, but

nvcc temp.cu -o temp -ccbin=/usr/bin/clang-4.0 -std=c++11

fails with the following:

/usr/include/boost/variant/detail/initializer.hpp(110): error: function "TestClass::TestClass(const TestClass &)"
temp.cu(10): here cannot be referenced -- it is a deleted function
          detected during:
            instantiation of "int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void *, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair=boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0>>, Iterator=boost::mpl::l_iter<boost::mpl::list1<TestClass>>]" 
/usr/include/boost/variant/variant.hpp(1538): here
            instantiation of "void boost::variant<T0_, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::convert_construct(T &, int, mpl_::false_) [with T0_=TestClass, T1=boost::detail::variant::void_, T2=boost::detail::variant::void_, T3=boost::detail::variant::void_, T4=boost::detail::variant::void_, T5=boost::detail::variant::void_, T6=boost::detail::variant::void_, T7=boost::detail::variant::void_, T8=boost::detail::variant::void_, T9=boost::detail::variant::void_, T10=boost::detail::variant::void_, T11=boost::detail::variant::void_, T12=boost::detail::variant::void_, T13=boost::detail::variant::void_, T14=boost::detail::variant::void_, T15=boost::detail::variant::void_, T16=boost::detail::variant::void_, T17=boost::detail::variant::void_, T18=boost::detail::variant::void_, T19=boost::detail::variant::void_, T=const TestClass]" 
/usr/include/boost/variant/variant.hpp(1683): here
            instantiation of "boost::variant<T0_, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::variant(const T &) [with T0_=TestClass, T1=boost::detail::variant::void_, T2=boost::detail::variant::void_, T3=boost::detail::variant::void_, T4=boost::detail::variant::void_, T5=boost::detail::variant::void_, T6=boost::detail::variant::void_, T7=boost::detail::variant::void_, T8=boost::detail::variant::void_, T9=boost::detail::variant::void_, T10=boost::detail::variant::void_, T11=boost::detail::variant::void_, T12=boost::detail::variant::void_, T13=boost::detail::variant::void_, T14=boost::detail::variant::void_, T15=boost::detail::variant::void_, T16=boost::detail::variant::void_, T17=boost::detail::variant::void_, T18=boost::detail::variant::void_, T19=boost::detail::variant::void_, T=TestClass]" 
temp.cu(17): here

1 error detected in the compilation of "/tmp/tmpxft_00005819_00000000-8_temp.cpp1.ii".

If I change boost/config/select_compiler_config.hpp

42 #elif defined __clang__ && !defined(__CUDACC__)

to

42 #elif defined __clang__

everything works well.

Change History (1)

comment:1 by John Maddock, 4 years ago

Resolution: obsolete
Status: newclosed

I'm pretty sure the && !defined(CUDACC) is quite deliberate, and removing it will break other things...

Moving the issue to https://github.com/boostorg/config/issues/237

Note: See TracTickets for help on using tickets.