Replace the two-level implementation with a simpler one that directly subclasses
the predicates, avoiding the instantiation of the template to get the type
member in a situation where we should short-circuit. This prevents incorrect
diagnostics when the instantiated predicate contains a static assertion.
Add a test case that reproduced the previous problem. The existing test case
involving HasNoValue didn't catch the problem because HasNoValue was in the
final position. The bug comes up when the predicate that shouldn't be
instantiated is after the short-circuit position but there is more to follow,
because then __conjunction_impl<False, BadPredicate, ...> instantiates
__conjunction_impl<BadPredicate, ...> (in order to obtain its type member),
which in turn instantiates BadPredicate in order to obtain its value member.
In contrast the new implementation doesn't recurse in instantiation any further
than it needs to, because it doesn't require particular members of the recursive
case.
I've also updated the test cases for std::disjunction to match,
although it doesn't have the same particular bug (its implementation is
quite different).
Fixes #58490.
I think this would be an equivalent fix, no?