lballabio / QuantLib

The QuantLib C++ library
http://quantlib.org
Other
5.25k stars 1.78k forks source link

Deprecation error using `clang v18` and `Boost v1.86` #2079

Open ralfkonrad opened 2 hours ago

ralfkonrad commented 2 hours ago

When trying to build the latest version I run into the following error:

> cmake --preset release
Preset CMake variables:

  CMAKE_BUILD_TYPE="Release"
  CMAKE_COMPILE_WARNING_AS_ERROR="ON"
  QL_FASTER_LAZY_OBJECTS="OFF"
  QL_THROW_IN_CYCLES="ON"

-- The CXX compiler identification is Clang 18.1.3
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/clang++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Boost: /home/linuxbrew/.linuxbrew/lib/cmake/Boost-1.86.0/BoostConfig.cmake (found suitable version "1.86.0", minimum required is "1.58.0")
-- Configuring done (2.9s)
-- Generating done (0.1s)
-- Build files have been written to: /home/ralfkonrad/dev/cpp/quantlib.rke/build/release

> cmake --build --preset release -j 12 -- -k 0
[1126/1149] Building CXX object ql/CMakeFiles/ql_library.dir/currency.cpp.o
FAILED: ql/CMakeFiles/ql_library.dir/currency.cpp.o
ccache /usr/bin/clang++ -DBOOST_ALL_NO_LIB -DQL_COMPILATION -Dql_library_EXPORTS -I/home/ralfkonrad/dev/cpp/quantlib.rke/build/release -I/home/ralfkonrad/dev/cpp/quantlib.rke -isystem /home/linuxbrew/.linuxbrew/include -O3 -DNDEBUG -std=c++17 -fPIC -Wall -Wno-unknown-pragmas -Werror -MD -MT ql/CMakeFiles/ql_library.dir/currency.cpp.o -MF ql/CMakeFiles/ql_library.dir/currency.cpp.o.d -o ql/CMakeFiles/ql_library.dir/currency.cpp.o -c /home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.cpp
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.cpp:20:
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.hpp:29:
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/errors.hpp:29:
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/shared_ptr.hpp:33:
In file included from /home/linuxbrew/.linuxbrew/include/boost/make_shared.hpp:14:
In file included from /home/linuxbrew/.linuxbrew/include/boost/smart_ptr/make_shared.hpp:15:
/home/linuxbrew/.linuxbrew/include/boost/smart_ptr/make_shared_object.hpp:257:17: error: 'Data' is deprecated [-Werror,-Wdeprecated-declarations]
  257 |     ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
      |                 ^
/home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.cpp:92:18: note: in instantiation of function template specialization 'boost::make_shared<QuantLib::Currency::Data, const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
   92 |     : data_(ext::make_shared<Currency::Data>(name,
      |                  ^
/home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.hpp:142:9: note: 'Data' has been explicitly marked deprecated here
  142 |         QL_DEPRECATED
      |         ^
/home/ralfkonrad/dev/cpp/quantlib.rke/build/release/ql/qldefines.hpp:201:42: note: expanded from macro 'QL_DEPRECATED'
  201 | #    define QL_DEPRECATED __attribute__((deprecated))
      |                                          ^
1 error generated.
ninja: build stopped: cannot make progress due to previous errors.

I tried #2078 but that doesn't help.

Also, the same works well with g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0.

ralfkonrad commented 2 hours ago

It is obvious, that the guards QL_DEPRECATED_DISABLE_WARNING and QL_DEPRECATED_ENABLE_WARNING are not being picked up. But I don't understand why.

https://github.com/lballabio/QuantLib/blob/fb835109c8103776db52c4d4552fa69181de458e/ql/currency.cpp#L32-L103

ralfkonrad commented 1 hour ago

The error message is different when I use QL_USE_STD_SHARED_PTR=ON and std::shared_ptr, but the result is the same:

> cmake --build --preset release -j 12 -- -k 0
[38/1149] Building CXX object ql/CMakeFiles/ql_library.dir/currency.cpp.o
FAILED: ql/CMakeFiles/ql_library.dir/currency.cpp.o
ccache /usr/bin/clang++ -DBOOST_ALL_NO_LIB -DQL_COMPILATION -Dql_library_EXPORTS -I/home/ralfkonrad/dev/cpp/quantlib.rke/build/release -I/home/ralfkonrad/dev/cpp/quantlib.rke -isystem /home/linuxbrew/.linuxbrew/include -O3 -DNDEBUG -std=c++17 -fPIC -Wall -Wno-unknown-pragmas -Werror -MD -MT ql/CMakeFiles/ql_library.dir/currency.cpp.o -MF ql/CMakeFiles/ql_library.dir/currency.cpp.o.d -o ql/CMakeFiles/ql_library.dir/currency.cpp.o -c /home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.cpp
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.cpp:20:
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.hpp:29:
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/errors.hpp:29:
In file included from /home/ralfkonrad/dev/cpp/quantlib.rke/ql/shared_ptr.hpp:30:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/memory:66:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_tempbuf.h:61:
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:119:25: error: 'Data' is deprecated [-Werror,-Wdeprecated-declarations]
  119 |       ::new((void*)__p) _Tp(std::forward<_Args>(__args)...);
      |                         ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/alloc_traits.h:661:9: note: in instantiation of function template specialization 'std::_Construct<QuantLib::Currency::Data, const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
  661 |         { std::_Construct(__p, std::forward<_Args>(__args)...); }
      |                ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/shared_ptr_base.h:604:30: note: in instantiation of function template specialization 'std::allocator_traits<std::allocator<void>>::construct<QuantLib::Currency::Data, const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
  604 |           allocator_traits<_Alloc>::construct(__a, _M_ptr(),
      |                                     ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/shared_ptr_base.h:972:6: note: in instantiation of function template specialization 'std::_Sp_counted_ptr_inplace<QuantLib::Currency::Data, std::allocator<void>, __gnu_cxx::_S_atomic>::_Sp_counted_ptr_inplace<const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
  972 |             _Sp_cp_type(__a._M_a, std::forward<_Args>(__args)...);
      |             ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/shared_ptr_base.h:1712:14: note: in instantiation of function template specialization 'std::__shared_count<>::__shared_count<QuantLib::Currency::Data, std::allocator<void>, const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
 1712 |         : _M_ptr(), _M_refcount(_M_ptr, __tag, std::forward<_Args>(__args)...)
      |                     ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/shared_ptr.h:464:4: note: in instantiation of function template specialization 'std::__shared_ptr<QuantLib::Currency::Data>::__shared_ptr<std::allocator<void>, const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
  464 |         : __shared_ptr<_Tp>(__tag, std::forward<_Args>(__args)...)
      |           ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/shared_ptr.h:1009:14: note: in instantiation of function template specialization 'std::shared_ptr<QuantLib::Currency::Data>::shared_ptr<std::allocator<void>, const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
 1009 |       return shared_ptr<_Tp>(_Sp_alloc_shared_tag<_Alloc>{__a},
      |              ^
/home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.cpp:92:18: note: in instantiation of function template specialization 'std::make_shared<QuantLib::Currency::Data, const std::basic_string<char> &, const std::basic_string<char> &, int &, const std::basic_string<char> &, const std::basic_string<char> &, int &, const QuantLib::Rounding &, const std::basic_string<char> &, const QuantLib::Currency &, const std::set<std::basic_string<char>> &>' requested here
   92 |     : data_(ext::make_shared<Currency::Data>(name,
      |                  ^
/home/ralfkonrad/dev/cpp/quantlib.rke/ql/currency.hpp:142:9: note: 'Data' has been explicitly marked deprecated here
  142 |         QL_DEPRECATED
      |         ^
/home/ralfkonrad/dev/cpp/quantlib.rke/build/release/ql/qldefines.hpp:201:42: note: expanded from macro 'QL_DEPRECATED'
  201 | #    define QL_DEPRECATED __attribute__((deprecated))
      |                                          ^
1 error generated.
ralfkonrad commented 1 hour ago

But what does work for both boost::shared_ptr and std::shared_ptr is changing from ext::make_shared<Currency::Data>(...) to the good old ext::shared_ptr<Currency::Data>(new Currency::Data(...).

    Currency::Currency(const std::string& name,
                       const std::string& code,
                       Integer numericCode,
                       const std::string& symbol,
                       const std::string& fractionSymbol,
                       Integer fractionsPerUnit,
                       const Rounding& rounding,
                       const std::string& formatString,
                       const Currency& triangulationCurrency,
                       const std::set<std::string>& minorUnitCodes)
    : data_(ext::shared_ptr<Currency::Data>(new Currency::Data(name,
                                                               code,
                                                               numericCode,
                                                               symbol,
                                                               fractionSymbol,
                                                               fractionsPerUnit,
                                                               rounding,
                                                               formatString,
                                                               triangulationCurrency,
                                                               minorUnitCodes))) {}