Bug 84075 - Template parameter not resolved: invalid application of ‘sizeof’ to incomplete type ‘boost::serialization::U’
Summary: Template parameter not resolved: invalid application of ‘sizeof’ to incomplet...
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 7.3.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2018-01-27 08:51 UTC by Matteo Settenvini
Modified: 2021-08-28 01:08 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2018-08-31 00:00:00


Attachments
Preprocessed file (439.38 KB, application/x-xz)
2018-01-27 08:51 UTC, Matteo Settenvini
Details
creduce output (1.72 KB, text/plain)
2018-08-31 23:11 UTC, Jonathan Wakely
Details
Reduced test case with eigen-only dependency (184 bytes, text/x-csrc)
2019-02-06 11:50 UTC, Marc Schmitt
Details
Preprocessed test case with eigen-only dependency (286.78 KB, application/x-xz)
2019-02-06 11:53 UTC, Marc Schmitt
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Matteo Settenvini 2018-01-27 08:51:19 UTC
Created attachment 43262 [details]
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,

// -----------------------------------------
Comment 1 Jonathan Wakely 2018-08-31 16:14:04 UTC
Confirmed. I'll update a creduce'd testcase shortly.
Comment 2 Jonathan Wakely 2018-08-31 23:11:09 UTC
Created attachment 44642 [details]
creduce output

Here's the result of many hours of creduction with this interestingness test:

#!/bin/bash
~/src/llvm/latest/bin/clang++ -std=c++17 petri.cc -c -w || exit 1
LANG=C g++ -std=c++17  petri.cc -c -w 2>out && exit 1
awk "/ error: invalid application of 'sizeof' to incomplete type 'boost::serialization::U'/ { found=1 ; --errors } / error: / { ++errors } END { exit found ? errors : 99 }" out

It compiles OK with clang but with g++ -std=c++17 -w the error is:

petri-net.cc: In instantiation of 'struct a::e<boost::serialization::U>':
petri-net.cc:44:50:   required from 'class a::k<a::g<boost::serialization::U, 0, int> >'
petri-net.cc:49:47:   required from 'class a::g<boost::serialization::U, 0, int>'
petri-net.cc:103:7:   required from 'static void boost::serialization::bh<au, d>::bi(au) [with au = boost::cl; d = a::aa<a::g<int>, a::g<a::g<int>, 0, int> >]'
petri-net.cc:109:3:   required from 'void boost::serialization::bk(au, d, int) [with au = boost::cl; d = a::aa<a::g<int>, a::g<a::g<int>, 0, int> >]'
petri-net.cc:148:5:   [ skipping 32 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
petri-net.cc:177:8:   required from 'static void boost::cj<au>::ck::bi(au, d) [with d = a::g<int>; au = boost::cl]'
petri-net.cc:182:11:   required from 'static void boost::cj<au>::bi(au, d) [with d = a::g<int>; au = boost::cl]'
petri-net.cc:188:9:   required from 'void boost::bj(au, d) [with au = boost::cl; d = a::g<int>]'
petri-net.cc:201:7:   required from 'void boost::co::cn(d) [with d = a::g<int>]'
petri-net.cc:208:5:   required from 'void boost::cp::cn(boost::serialization::bd<d>) [with d = a::g<int>]'
petri-net.cc:195:46:   required from 'boost::cl& boost::interface_iarchive< <template-parameter-1-1> >::operator>>(d) [with d = boost::serialization::bd<a::g<int> >; <template-parameter-1-1> = int]'
petri-net.cc:225:40:   required from here
petri-net.cc:37:15: error: invalid application of 'sizeof' to incomplete type 'boost::serialization::U'
37 |   typename b< sizeof(d) >::type NonInteger;
   |               ^~~~~~~~~


Bizarrely, it compiles OK if __attribute__((__used__)) is removed on line 167.
Comment 3 Jonathan Wakely 2018-08-31 23:12:38 UTC
(In reply to Jonathan Wakely from comment #2)
> Here's the result of many hours of creduction 

(and some manual reduction)
Comment 4 ensadc 2018-09-01 13:08:00 UTC
Further reduced:

template < int > struct b { };
template < typename n > struct g {
  typedef b< sizeof(n) > l;
};
template < typename h, typename = typename g< h >::l > class aa {};
template < typename h, typename bz >
void bj(aa< h, bz >, int);
template < template < class > class ct > void bj(ct< class U >);
void f() {
  bj(aa<int>(), 0);
}
----

(`__attribute__((__used__))` in the original example matters because it ensures that the call is instantiated.)
Comment 5 Marc Schmitt 2019-02-06 11:48:35 UTC
Hi,

we encountered a the same bug.

See: https://stackoverflow.com/questions/54534047/eigen-matrix-boostserialization-c17

The bug is reproducible with G++8. 

The bug seems to be related with the (new?) template argument deduction mechanism in G++7/8 with --std=c++17 (or --std=gnu++17).

A simplified test case (thx @Marc Giese/SO), reproducing the problem just including Eigen without the boost dependency is attached (see below).

// --------------------------------------------
// G++ 7
// --------------------------------------------

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
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='Ubuntu 7.3.0-27ubuntu1~18.04' --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 (Ubuntu 7.3.0-27ubuntu1~18.04)


// --------------------------------------------
// G++ 8
// --------------------------------------------

$ g++-8 -v
Using built-in specs.
COLLECT_GCC=g++-8
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 8.2.0-1ubuntu2~18.04' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --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 8.2.0 (Ubuntu 8.2.0-1ubuntu2~18.04)

// --------------------------------------------
// testcase (see: https://stackoverflow.com/a/54536756/1267320)
// --------------------------------------------

#include <Eigen/Core>

template<template<class U>class SPT>void f(SPT<class U>&);
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
void f(Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> & arMatrix){};

int main()
{
  Eigen::Matrix2d m;
  f(m);
}

// --------------------------------------------
compile with: (G++7 or G++8)
g++ -std=c++17 main.cpp

// --------------------------------------------
Error output:

$ g++ -std=c++17 main.cpp
In file included from /usr/local/include/Eigen/Core:365:0,
                 from main.cpp:1:
/usr/local/include/Eigen/src/Core/util/ForwardDeclarations.h: In instantiation of ‘struct Eigen::internal::accessors_level<U>’:
main.cpp:9:8:   recursively required by substitution of ‘template<template<class U> class SPT> void f(SPT<U>&) [with SPT = <missing>]’
main.cpp:9:8:   required from here
/usr/local/include/Eigen/src/Core/util/ForwardDeclarations.h:32:54: error: incomplete type ‘Eigen::internal::traits<U>’ used in nested name specifier
   enum { has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,
                              ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/usr/local/include/Eigen/src/Core/util/ForwardDeclarations.h:33:53: error: incomplete type ‘Eigen::internal::traits<U>’ used in nested name specifier
          has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,
                             ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~

// --------------------------------------------
// Preprocessed code
// --------------------------------------------
compiled with: g++ -std=c++17 -E main.cpp > pp_main_minimal.ii

See the attached pp_main_minimal.ii
Comment 6 Marc Schmitt 2019-02-06 11:50:38 UTC
Created attachment 45618 [details]
Reduced test case with eigen-only dependency
Comment 7 Marc Schmitt 2019-02-06 11:53:01 UTC
Created attachment 45619 [details]
Preprocessed test case with eigen-only dependency
Comment 8 Christoph Hertzberg 2019-02-06 15:00:28 UTC
Another case where someone hit this problem:
https://stackoverflow.com/questions/54534047/eigen-matrix-boostserialization-c17/

Corresponding Bug at the Eigen-library:
http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1676
Comment 9 Christoph Hertzberg 2019-02-07 12:31:01 UTC
Independent of this issue, the forward declaration in boost/serialization/shared_ptr_helper.hpp does not make sense. I created a PR to fix that:
https://github.com/boostorg/serialization/pull/144
Comment 10 Gael Guennebaud 2019-02-07 14:30:45 UTC
I created a simplified example that has no dependencies at all:

https://godbolt.org/z/uIy1Uu

You can workaround the compilation issue by either:

#1 - commenting line 16 and uncommenting line 15,
     i.e.,  by by-passing some indirection.

#2 - commenting line 16 and uncommenting line 21,
     i.e., by removing the default value of the second templated parameter of Base<>.

Hope it will help fixing the issue.
Comment 11 Andrew Pinski 2021-08-28 01:08:37 UTC
(In reply to ensadc from comment #4)
> Further reduced:
> 
> template < int > struct b { };
> template < typename n > struct g {
>   typedef b< sizeof(n) > l;
> };
> template < typename h, typename = typename g< h >::l > class aa {};
> template < typename h, typename bz >
> void bj(aa< h, bz >, int);
> template < template < class > class ct > void bj(ct< class U >);
> void f() {
>   bj(aa<int>(), 0);
> }
> ----

Hmm, it comes with -std=c++11 and -std=c++14 but not -std=c++17.