This is being emitted with [GCC 10.2.1](https://packages.debian.org/bullseye/g++-arm-linux-gnueabihf), in some CI jobs: i.e https://github.com/bitcoin/bitcoin/pull/25972/checks?check_run_id=12423693655, or https://github.com/bitcoin/bitcoin/pull/25972/checks?check_run_id=12423693651 (where we actually turn on all our warning flags with depends builds).
```bash
In file included from test/miniscript_tests.cpp:19:
./script/miniscript.h:1197:71: error: comparison of integers of different signs: 'typename iterator_traits<int *>::difference_type' (aka 'int') and 'const uint32_t' (aka 'const unsigned int') [-Werror,-Wsign-compare]
                    return std::count(subs.begin(), subs.end(), true) >= node.k;
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~
test/miniscript_tests.cpp:346:34: note: in instantiation of function template specialization 'miniscript::Node<CPubKey>::IsSatisfiable<(lambda at test/miniscript_tests.cpp:346:48)>' requested here
        bool satisfiable = node->IsSatisfiable([](const Node&) { return true; });
                                 ^
1 error generated.
```

cc @darosior 
while (stack.size()) {
            const Node& node = stack.back().node;
            if (stack.back().expanded < node.subs.size()) {
                /* We encounter a tree node with at least one unexpanded child.
                 * Expand it. By the time we hit this node again, the result of
                 * that child (and all earlier children) will be at the end of `results`. */
                size_t child_index = stack.back().expanded++;
                State child_state = downfn(stack.back().state, node, child_index);
                stack.emplace_back(*node.subs[child_index], 0, std::move(child_state));
                continue;
            }
            
            assert(results.size() >= node.subs.size());
            std::optional<Result> result{upfn(std::move(stack.back().state), node,
                Span<Result>{results}.last(node.subs.size()))};
            
            if (!result) return {};
            
            results.erase(results.end() - node.subs.size(), results.end());
            results.push_back(std::move(*result));
            stack.pop_back();
        }
        
        assert(results.size() == 1);
        return std::move(results[0]);
    }
    /** Like TreeEvalMaybe, but without downfn or State type.
     * upfn takes (const Node&, Span<Result>) and returns std::optional<Result>. */
    template<typename Result, typename UpFn>
    std::optional<Result> TreeEvalMaybe(UpFn upfn) const