Skip to content

Compilation error recursive type or function dependency context too complex when using a lot of Eigen array arguments #1828

@tadeu

Description

@tadeu

Issue description

The bindings for a function that worked in pybind11 2.2.4 does not compile anymore in pybind11 2.3.0. The function contains a lot of arguments with Eigen arrays.

Reproducible example code

I've built this minimal case:

#include <pybind11/pybind11.h>
#include <pybind11/eigen.h>

namespace py = pybind11;

using EigenArray2d = Eigen::Array<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
using EigenArray2dConstRef = Eigen::Ref<const EigenArray2d>;

void f(
    EigenArray2dConstRef const& a00,
    EigenArray2dConstRef const& a01,
    EigenArray2dConstRef const& a02,
    EigenArray2dConstRef const& a03,
    EigenArray2dConstRef const& a04,
    EigenArray2dConstRef const& a05,
    EigenArray2dConstRef const& a06,
    EigenArray2dConstRef const& a07,
    EigenArray2dConstRef const& a08,
    EigenArray2dConstRef const& a09,
    EigenArray2dConstRef const& a10,
    EigenArray2dConstRef const& a11,
    EigenArray2dConstRef const& a12,
    EigenArray2dConstRef const& a13,
    EigenArray2dConstRef const& a14,
    EigenArray2dConstRef const& a15,
    EigenArray2dConstRef const& a16,
    EigenArray2dConstRef const& a17,
    EigenArray2dConstRef const& a18,
    EigenArray2dConstRef const& a19
);

void test(py::module& m)
{
    m.def("f", &f);
}

my current workaround is to create wrapper functions (or constructors), receiving py::args and py::kwargs, casting everything and passing them down to the original function (but this does not seem to be a good solution).

Error information

This is the current compilation error, from MSVC 2017 (15.8.7):

c:\conda\envs\test_pybind11\include\pybind11\detail\descr.h(45): fatal error C1202: recursive type or function dependency context too complex
c:\conda\envs\test_pybind11\include\pybind11\detail\descr.h(49): note: see reference to function template instantiation 'pybind11::detail::descr<1038> pybind11::detail::plus_impl<52,986,,,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450...
c:\conda\envs\test_pybind11\include\pybind11\detail\descr.h(90): note: see reference to function template instantiation 'pybind11::detail::descr<1038> pybind11::detail::operator +<52,986,,>(const pybind11::detail::descr<52> &,const pybind11::detail::descr<986> &)' being compiled
c:\conda\envs\test_pybind11\include\pybind11\cast.h(1900): note: see reference to function template instantiation 'pybind11::detail::descr<1038> pybind11::detail::concat<50,,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>,pybind11::detail::descr<50>>(const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &,const pybind11::detail::descr<50> &)' being compiled
c:\conda\envs\test_pybind11\include\pybind11\pybind11.h(101): note: see reference to class template instantiation 'pybind11::detail::argument_loader<const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &>' being compiled
c:\conda\envs\test_pybind11\include\pybind11\pybind11.h(64): note: see reference to function template instantiation 'void pybind11::cpp_function::initialize<Return(__cdecl *&)(const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &),Return,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,pybind11::name,pybind11::scope,pybind11::sibling>(Func,Return (__cdecl *)(const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &),const pybind11::name &,const pybind11::scope &,c...
c:\conda\envs\test_pybind11\include\pybind11\pybind11.h(819): note: see reference to function template instantiation 'pybind11::cpp_function::cpp_function<void,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,const EigenArray2dConstRef&,pybind11::name,pybind11::scope,pybind11::sibling>(Return (__cdecl *)(const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &),const pybind11::name &,const pybind11::scope &,const pybind11::sibling &)' being compiled
        with
        [
            Return=void
        ]
c:\dev\test_pybind11\test_pybind11.cpp(34): note: see reference to function template instantiation 'pybind11::module &pybind11::module::def<void(__cdecl *)(const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &),>(const char *,Func &&)' being compiled
        with
        [
            Func=void (__cdecl *)(const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &,const EigenArray2dConstRef &)
        ]
c:\conda\envs\test_pybind11\include\pybind11\cast.h(1556): note: see reference to class template instantiation 'pybind11::detail::descr<8>' being compiled
c:\conda\envs\test_pybind11\include\pybind11\cast.h(1554): note: see reference to class template instantiation 'pybind11::detail::descr<5>' being compiled
c:\conda\envs\test_pybind11\include\pybind11\cast.h(1109): note: see reference to class template instantiation 'pybind11::detail::descr<7>' being compiled

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions