On Tue, Nov 5, 2019 at 2:42 PM Jeff Chapman <jchap...@lock3software.com> wrote:
>
> On Thu, Oct 31, 2019 at 8:03 AM Nathan Sidwell wrote:
> > Why doesn't the std specify the satisfaction nesting limit in the same
> > way as template instantiation? (at least that's what I infer from your
> > question).
>
> I'm not sure why it's not explicitly listed along with the template
> instantiation limit ([implimits]/2.41). Perhaps it's something that
> should be added? It does seem like a distinct limit since satisfaction
> can occur recursively without having more than one template
> instantiation in the call stack at any given time. To give an example:
>
> template<int N = 1, typename T = int>
>   requires requires(T t) { foo<N + 1>(t); }
> void foo(T t) { }
>
> A call to foo<1>(1) results in unbounded call stack like:
>
> resolve foo<1>(int)
>   instantiate the decl of foo<1>(int)
>   check if foo<1>(int) satisfies its constraints
>     resolve foo<2>(int)
>       instantiate the decl of foo<2>(int)
>       check if foo<2>(int) satisfies its constraints
>         ...
>
> Per [temp.inst]/17 "the type-constraints and requires-clause of a
> template specialization or member function are not instantiated along
> with the specialization or function itself" so instantiating the decl
> of foo<1>(int) does not depend on the instantiation of any other
> template and the template instantiation depth is only incremented once
> before decremented when control flow returns to overload resolution.
>
> This needs to be resolved someway, but reusing the template
> instantiation depth limit would be an odd choice since there are no
> recursive template instantiations in the process. A parallel
> -fsatisfaction-depth= limit and associated diagnostics seems like a
> better way to resolve this issue.

We track other substitution cases as part of the template
instantiation depth limit, notably instantiating the
noexcept-specifier.  This seems like a similar situation.

Jason

Reply via email to