https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84075
Bug ID: 84075 Summary: Template parameter not resolved: invalid application of ‘sizeof’ to incomplete type ‘boost::serialization::U’ Product: gcc Version: 7.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: matteo-ml at member dot fsf.org Target Milestone: --- Created attachment 43262 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43262&action=edit Preprocessed file I encounter the following error when building a C++ source file doing some moderately deep template instantiation due to Eigen + Boost.Serialization. I cannot reproduce the same error on a minimal example, although I tried. Clang builds the same sources fine (and the resulting linked binary runs correctly). I can reproduce the same problem also with older g++ versions. // ----------------------------------------- $ g++ -v Using built-in specs. COLLECT_GCC=/usr/bin/g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 7.3.0-1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 7.3.0 (Debian 7.3.0-1) // ----------------------------------------- FAILED: CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o /usr/bin/g++ -Dgadv_EXPORTS -Dgadv_backend_EXPORTS -I/home/matteo/Progetti/gadv/include -Iinclude -I/home/matteo/Progetti/gadv/src/gadv-backend -isystem /usr/include/eigen3 -isystem /usr/include/pangomm-1.4 -isystem /usr/lib/x86_64-linux-gnu/pangomm-1.4/include -isystem /usr/include/glibmm-2.4 -isystem /usr/lib/x86_64-linux-gnu/glibmm-2.4/include -isystem /usr/include/cairomm-1.0 -isystem /usr/lib/x86_64-linux-gnu/cairomm-1.0/include -isystem /usr/include/sigc++-2.0 -isystem /usr/lib/x86_64-linux-gnu/sigc++-2.0/include -isystem /usr/include/pango-1.0 -isystem /usr/include/harfbuzz -isystem /usr/include/cairo -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /usr/include/pixman-1 -isystem /usr/include/freetype2 -isystem /usr/include/libpng16 -ftemplate-backtrace-limit=0 -fdiagnostics-color=always -O3 -DNDEBUG -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -pedantic -fstack-protector-strong -std=gnu++1z -MD -MT CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o -MF CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o.d -o CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o -c /home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc In file included from /usr/include/eigen3/Eigen/Core:351:0, from /usr/include/eigen3/Eigen/SparseCore:11, from /home/matteo/Progetti/gadv/include/gadv/logic/petri-net.hh:24, from /home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc:18: /usr/include/eigen3/Eigen/src/Core/NumTraits.h: In instantiation of ‘struct Eigen::GenericNumTraits<boost::serialization::U>’: /usr/include/eigen3/Eigen/src/Core/NumTraits.h:150:29: required from ‘struct Eigen::NumTraits<boost::serialization::U>’ /usr/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h:109:30: required from ‘class Eigen::SparseMatrixBase<Eigen::SparseMatrix<boost::serialization::U, 0, int> >’ /usr/include/eigen3/Eigen/src/SparseCore/SparseCompressedBase.h:36:7: required from ‘class Eigen::SparseCompressedBase<Eigen::SparseMatrix<boost::serialization::U, 0, int> >’ /usr/include/boost/serialization/split_free.hpp:58:13: recursively required by substitution of ‘template<class Archive, template<class U> class SPT> void boost::serialization::load(Archive&, SPT<boost::serialization::U>&, unsigned int) [with Archive = boost::archive::xml_iarchive; SPT = <missing>]’ /usr/include/boost/serialization/split_free.hpp:58:13: required from ‘static void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long int>]’ /usr/include/boost/serialization/split_free.hpp:74:18: required from ‘void boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long int>]’ /home/matteo/Progetti/gadv/gadv-backend/logic/serialization-helpers.tcc:55:16: required from ‘void boost::serialization::serialize(Archive&, Eigen::Triplet<Scalar, Index>&, boost::serialization::version_type) [with Archive = boost::archive::xml_iarchive; Scalar = long int; Index = long int]’ /usr/include/boost/serialization/serialization.hpp:126:14: required from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long int>]’ /usr/include/boost/archive/detail/iserializer.hpp:188:40: required from ‘void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long int>]’ /usr/include/boost/archive/detail/iserializer.hpp:120:1: required from ‘class boost::archive::detail::iserializer<boost::archive::xml_iarchive, Eigen::Triplet<long int, long int> >’ /usr/include/boost/archive/detail/iserializer.hpp:410:13: required from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::load_standard::invoke(Archive&, const T&) [with T = Eigen::Triplet<long int, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/iserializer.hpp:462:22: required from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = Eigen::Triplet<long int, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/iserializer.hpp:618:18: required from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long int>]’ /usr/include/boost/archive/detail/common_iarchive.hpp:66:22: required from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with T = Eigen::Triplet<long int, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/basic_xml_iarchive.hpp:78:9: required from ‘void boost::archive::basic_xml_iarchive<Archive>::load_override(const boost::serialization::nvp<T>&) [with T = Eigen::Triplet<long int, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/xml_iarchive.hpp:95:51: required from ‘void boost::archive::xml_iarchive_impl<Archive>::load_override(T&) [with T = const boost::serialization::nvp<Eigen::Triplet<long int, long int> >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/interface_iarchive.hpp:68:9: required from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const boost::serialization::nvp<Eigen::Triplet<long int, long int> >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/serialization/collections_load_imp.hpp:72:12: required from ‘typename boost::enable_if<boost::serialization::detail::is_default_constructible<typename T::value_type>, void>::type boost::serialization::stl::collection_load_impl(Archive&, T&, boost::serialization::collection_size_type, boost::serialization::item_version_type) [with Archive = boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >; typename boost::enable_if<boost::serialization::detail::is_default_constructible<typename T::value_type>, void>::type = void]’ /usr/include/boost/serialization/vector.hpp:91:30: required from ‘void boost::serialization::load(Archive&, std::vector<U, Allocator>&, unsigned int, mpl_::false_) [with Archive = boost::archive::xml_iarchive; U = Eigen::Triplet<long int, long int>; Allocator = std::allocator<Eigen::Triplet<long int, long int> >; mpl_::false_ = mpl_::bool_<false>]’ /usr/include/boost/serialization/vector.hpp:159:9: required from ‘void boost::serialization::load(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::archive::xml_iarchive; U = Eigen::Triplet<long int, long int>; Allocator = std::allocator<Eigen::Triplet<long int, long int> >]’ /usr/include/boost/serialization/split_free.hpp:58:13: required from ‘static void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >]’ /usr/include/boost/serialization/split_free.hpp:74:18: required from ‘void boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >]’ /usr/include/boost/serialization/vector.hpp:170:37: required from ‘void boost::serialization::serialize(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::archive::xml_iarchive; U = Eigen::Triplet<long int, long int>; Allocator = std::allocator<Eigen::Triplet<long int, long int> >]’ /usr/include/boost/serialization/serialization.hpp:126:14: required from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >]’ /usr/include/boost/archive/detail/iserializer.hpp:188:40: required from ‘void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >]’ /usr/include/boost/archive/detail/iserializer.hpp:120:1: required from ‘class boost::archive::detail::iserializer<boost::archive::xml_iarchive, std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > > >’ /usr/include/boost/archive/detail/iserializer.hpp:410:13: required from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::load_standard::invoke(Archive&, const T&) [with T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/iserializer.hpp:462:22: required from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/iserializer.hpp:618:18: required from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >]’ /usr/include/boost/archive/detail/common_iarchive.hpp:66:22: required from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/basic_xml_iarchive.hpp:78:9: required from ‘void boost::archive::basic_xml_iarchive<Archive>::load_override(const boost::serialization::nvp<T>&) [with T = std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/xml_iarchive.hpp:95:51: required from ‘void boost::archive::xml_iarchive_impl<Archive>::load_override(T&) [with T = const boost::serialization::nvp<std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > > >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/interface_iarchive.hpp:68:9: required from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const boost::serialization::nvp<std::vector<Eigen::Triplet<long int, long int>, std::allocator<Eigen::Triplet<long int, long int> > > >; Archive = boost::archive::xml_iarchive]’ /home/matteo/Progetti/gadv/gadv-backend/logic/serialization-helpers.tcc:66:62: required from ‘typename std::enable_if<std::is_convertible<Matrix*, Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type boost::serialization::load(Archive&, Matrix&, boost::serialization::version_type) [with Archive = boost::archive::xml_iarchive; Matrix = Eigen::SparseMatrix<long int, 0, long int>; typename std::enable_if<std::is_convertible<Matrix*, Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type = void]’ /usr/include/boost/serialization/split_free.hpp:58:13: required from ‘static void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0, long int>]’ /usr/include/boost/serialization/split_free.hpp:74:18: required from ‘void boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0, long int>]’ /home/matteo/Progetti/gadv/gadv-backend/logic/serialization-helpers.tcc:99:16: required from ‘typename std::enable_if<std::is_convertible<Matrix*, Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type boost::serialization::serialize(Archive&, Matrix&, boost::serialization::version_type) [with Archive = boost::archive::xml_iarchive; Matrix = Eigen::SparseMatrix<long int, 0, long int>; typename std::enable_if<std::is_convertible<Matrix*, Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type = void]’ /usr/include/boost/serialization/serialization.hpp:126:14: required from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0, long int>]’ /usr/include/boost/archive/detail/iserializer.hpp:188:40: required from ‘void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0, long int>]’ /usr/include/boost/archive/detail/iserializer.hpp:120:1: required from ‘class boost::archive::detail::iserializer<boost::archive::xml_iarchive, Eigen::SparseMatrix<long int, 0, long int> >’ /usr/include/boost/archive/detail/iserializer.hpp:410:13: required from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::load_standard::invoke(Archive&, const T&) [with T = Eigen::SparseMatrix<long int, 0, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/iserializer.hpp:462:22: required from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = Eigen::SparseMatrix<long int, 0, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/iserializer.hpp:618:18: required from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0, long int>]’ /usr/include/boost/archive/detail/common_iarchive.hpp:66:22: required from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with T = Eigen::SparseMatrix<long int, 0, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/basic_xml_iarchive.hpp:78:9: required from ‘void boost::archive::basic_xml_iarchive<Archive>::load_override(const boost::serialization::nvp<T>&) [with T = Eigen::SparseMatrix<long int, 0, long int>; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/xml_iarchive.hpp:95:51: required from ‘void boost::archive::xml_iarchive_impl<Archive>::load_override(T&) [with T = const boost::serialization::nvp<Eigen::SparseMatrix<long int, 0, long int> >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/interface_iarchive.hpp:68:9: required from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const boost::serialization::nvp<Eigen::SparseMatrix<long int, 0, long int> >; Archive = boost::archive::xml_iarchive]’ /usr/include/boost/archive/detail/interface_iarchive.hpp:75:32: required from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator&(T&) [with T = const boost::serialization::nvp<Eigen::SparseMatrix<long int, 0, long int> >; Archive = boost::archive::xml_iarchive]’ /home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc:310:8: required from ‘void gadv::PetriNet::serialize(Archive&, unsigned int) [with Archive = boost::archive::xml_iarchive]’ /usr/include/boost/serialization/access.hpp:116:9: required from ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’ /usr/include/boost/serialization/serialization.hpp:68:22: required from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’ /usr/include/boost/serialization/serialization.hpp:126:14: required from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’ /usr/include/boost/archive/detail/iserializer.hpp:188:40: required from ‘void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’ /usr/include/boost/archive/detail/iserializer.hpp:120:1: required from ‘class boost::archive::detail::iserializer<boost::archive::xml_iarchive, gadv::PetriNet>’ /usr/include/boost/archive/detail/iserializer.hpp:369:31: required from ‘boost::archive::detail::pointer_iserializer<Archive, T>::pointer_iserializer() [with Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’ /usr/include/boost/serialization/singleton.hpp:100:7: required from ‘static T& boost::serialization::singleton<T>::get_instance() [with T = boost::archive::detail::pointer_iserializer<boost::archive::xml_iarchive, gadv::PetriNet>]’ /usr/include/boost/serialization/singleton.hpp:135:28: required from ‘static const T& boost::serialization::singleton<T>::get_const_instance() [with T = boost::archive::detail::pointer_iserializer<boost::archive::xml_iarchive, gadv::PetriNet>]’ /usr/include/boost/serialization/export.hpp:66:30: required from ‘static const boost::archive::detail::basic_pointer_iserializer& boost::archive::detail::export_impl<Archive, Serializable>::enable_load(mpl_::true_) [with Archive = boost::archive::xml_iarchive; Serializable = gadv::PetriNet; mpl_::true_ = mpl_::bool_<true>]’ /usr/include/boost/serialization/export.hpp:105:51: required from ‘static void boost::archive::detail::ptr_serialization_support<Archive, Serializable>::instantiate() [with Archive = boost::archive::xml_iarchive; Serializable = gadv::PetriNet]’ /usr/include/boost/serialization/export.hpp:86:1: required from ‘struct boost::archive::detail::ptr_serialization_support<boost::archive::xml_iarchive, gadv::PetriNet>’ /usr/include/boost/archive/detail/register_archive.hpp:25:8: required from ‘struct boost::archive::detail::_ptr_serialization_support<boost::archive::xml_iarchive, gadv::PetriNet>’ /usr/include/boost/archive/xml_iarchive.hpp:136:1: required by substitution of ‘template<class Serializable> typename boost::archive::detail::_ptr_serialization_support<boost::archive::xml_iarchive, Serializable>::type boost::archive::detail::instantiate_ptr_serialization(Serializable*, boost::archive::xml_iarchive*, boost::archive::detail::adl_tag) [with Serializable = gadv::PetriNet]’ /usr/include/boost/serialization/export.hpp:123:38: required from ‘void boost::archive::detail::extra_detail::guid_initializer<T>::export_guid(mpl_::false_) const [with T = gadv::PetriNet; mpl_::false_ = mpl_::bool_<false>]’ /usr/include/boost/serialization/export.hpp:133:20: required from ‘const boost::archive::detail::extra_detail::guid_initializer<T>& boost::archive::detail::extra_detail::guid_initializer<T>::export_guid() const [with T = gadv::PetriNet]’ /home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc:47:1: required from here /usr/include/eigen3/Eigen/src/Core/NumTraits.h:103:59: error: invalid application of ‘sizeof’ to incomplete type ‘boost::serialization::U’ typename internal::conditional<sizeof(T)<=2, float, double>::type, // -----------------------------------------