boost-ext / di

C++14 Dependency Injection Library
https://boost-ext.github.io/di
1.14k stars 138 forks source link

Build error for 32bit in named_parameters.cpp #449

Open thorsten-klein opened 4 years ago

thorsten-klein commented 4 years ago

Expected Behavior

Compilation finishes successful

Actual Behavior

Build is failing with following errors:

In file included from named_parameters.cpp:11:0:
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp: In instantiation of ‘struct boost::di::v1_1_0::extension::parse<example::boost_di_inject__, int, 2>’:
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:97:69:   required from ‘struct boost::di::v1_1_0::extension::args_impl<example::boost_di_inject__, boost::di::v1_1_0::aux::index_sequence<0, 1, 2>, int, std::unique_ptr<interface, std::default_delete<interface> >, int>’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:105:97:   required from ‘struct boost::di::v1_1_0::extension::args__<true, example::boost_di_inject__, int, std::unique_ptr<interface, std::default_delete<interface> >, int>’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:115:69:   required from ‘struct boost::di::v1_1_0::extension::args<example::boost_di_inject__ (*)(int, std::unique_ptr<interface>, int)>’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:124:38:   required by substitution of ‘template<class T> using args_t = typename boost::di::v1_1_0::extension::args::type [with T = example::boost_di_inject__ (*)(int, std::unique_ptr<interface>, int)]’
named_parameters.cpp:29:3:   required from here
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:89:120: error: overflow in constant expression [-fpermissive]
                                   named<aux::integral_constant<long, const_hash(&T::str[name.begin], name.end)>, TArg>>;
                                                                                                                        ^
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:89:120: note: in template argument for type ‘long int’ 
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp: In instantiation of ‘constexpr auto boost::di::v1_1_0::extension::operator""_s() [with T = char; T ...Chars = {'m', 'y', '_', 'v', 'a', 'l', 'u', 'e'}]’:
named_parameters.cpp:44:27:   required from here
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:52:92: error: overflow in constant expression [-fpermissive]
   return aux::integral_constant<long, const_hash(chars<Chars...>{}, sizeof...(Chars) + 1)>{};
                                                                                            ^
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:52:92: note: in template argument for type ‘long int’ 
named_parameters.cpp: In function ‘int main()’:
named_parameters.cpp:44:39: error: invalid use of void expression
     , di::bind<int>.named("my_value"_s).to(87)
                                       ^
named_parameters.cpp:48:26: error: expected primary-expression before ‘>’ token
   injector.create<example>();
                          ^
named_parameters.cpp:48:28: error: expected primary-expression before ‘)’ token
   injector.create<example>();

Steps to Reproduce the Problem

Compile single file extension/test/injections/named_parameters.cpp

  1. 64bit (OK) g++ -m64 named_parameters.cpp -I $PWD/../../include -I $PWD/../../../include -std=c++14
  2. 32bit (FAILS) g++ -m32 named_parameters.cpp -I $PWD/../../include -I $PWD/../../../include -std=c++14

Specifications

thorsten-klein commented 4 years ago

Update: When using g++ version 6.2.0 there are even more errors:

In file included from named_parameters.cpp:11:0:
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp: In instantiation of ‘struct boost::di::v1_1_0::extension::parse<example::boost_di_inject__, int, 2>’:
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:97:69:   required from ‘struct boost::di::v1_1_0::extension::args_impl<example::boost_di_inject__, boost::di::v1_1_0::aux::index_sequence<0, 1, 2>, int, std::unique_ptr<interface, std::default_delete<interface> >, int>’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:105:97:   required from ‘struct boost::di::v1_1_0::extension::args__<true, example::boost_di_inject__, int, std::unique_ptr<interface, std::default_delete<interface> >, int>’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:115:69:   required from ‘struct boost::di::v1_1_0::extension::args<example::boost_di_inject__ (*)(int, std::unique_ptr<interface>, int)>’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:124:38:   required by substitution of ‘template<class T> using args_t = typename boost::di::v1_1_0::extension::args::type [with T = example::boost_di_inject__ (*)(int, std::unique_ptr<interface>, int)]’
named_parameters.cpp:29:3:   required from here
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:89:80:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash((((const char*)example::boost_di_inject__::str) + ((sizetype)boost::di::v1_1_0::extension::parse<example::boost_di_inject__, int, 2>::name.boost::di::v1_1_0::extension::pair::begin)), ((long int)boost::di::v1_1_0::extension::parse<example::boost_di_inject__, int, 2>::name.boost::di::v1_1_0::extension::pair::end), 0l)’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:56:71:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash((input + 1u), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:56:71:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash((input + 1u), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:56:71:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash((input + 1u), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:56:71:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash((input + 1u), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:89:120: error: overflow in constant expression [-fpermissive]
                                   named<aux::integral_constant<long, const_hash(&T::str[name.begin], name.end)>, TArg>>;
                                                                                                                        ^
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:89:120: error: overflow in constant expression [-fpermissive]
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:89:120: note: in template argument for type ‘long int’ 
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp: In instantiation of ‘constexpr auto boost::di::v1_1_0::extension::operator""_s() [with T = char; T ...Chars = {'m', 'y', '_', 'v', 'a', 'l', 'u', 'e'}]’:
named_parameters.cpp:44:27:   required from here
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:52:49:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash<'m', {'y', '_', 'v', 'a', 'l', 'u', 'e'}>(boost::di::v1_1_0::extension::chars<'m', 'y', '_', 'v', 'a', 'l', 'u', 'e'>{}, ((long int)(8u + 1u)), 0l)’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:61:61:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash<'y', {'_', 'v', 'a', 'l', 'u', 'e'}>(((const boost::di::v1_1_0::extension::chars<'y', '_', 'v', 'a', 'l', 'u', 'e'>&)(& boost::di::v1_1_0::extension::chars<'y', '_', 'v', 'a', 'l', 'u', 'e'>{})), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:61:61:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash<'_', {'v', 'a', 'l', 'u', 'e'}>(((const boost::di::v1_1_0::extension::chars<'_', 'v', 'a', 'l', 'u', 'e'>&)(& boost::di::v1_1_0::extension::chars<'_', 'v', 'a', 'l', 'u', 'e'>{})), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:61:61:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash<'v', {'a', 'l', 'u', 'e'}>(((const boost::di::v1_1_0::extension::chars<'v', 'a', 'l', 'u', 'e'>&)(& boost::di::v1_1_0::extension::chars<'v', 'a', 'l', 'u', 'e'>{})), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:61:61:   in constexpr expansion of ‘boost::di::v1_1_0::extension::const_hash<'a', {'l', 'u', 'e'}>(((const boost::di::v1_1_0::extension::chars<'a', 'l', 'u', 'e'>&)(& boost::di::v1_1_0::extension::chars<'a', 'l', 'u', 'e'>{})), m, (i + 1l))’
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:52:92: error: overflow in constant expression [-fpermissive]
   return aux::integral_constant<long, const_hash(chars<Chars...>{}, sizeof...(Chars) + 1)>{};
                                                                                            ^
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:52:92: error: overflow in constant expression [-fpermissive]
/home/default/work/di/extension/include/boost/di/extension/injections/named_parameters.hpp:52:92: note: in template argument for type ‘long int’ 
named_parameters.cpp: In function ‘int main()’:
named_parameters.cpp:44:39: error: invalid use of void expression
     , di::bind<int>.named("my_value"_s).to(87)
                                       ^
named_parameters.cpp:48:26: error: expected primary-expression before ‘>’ token
   injector.create<example>();
                          ^
named_parameters.cpp:48:28: error: expected primary-expression before ‘)’ token
   injector.create<example>();
                            ^