[all-commits] [llvm/llvm-project] a0549e: [libc++] type_traits: fix short-circuiting in std:...
Aaron Jacobs via All-commits
all-commits at lists.llvm.org
Fri Oct 21 04:09:55 PDT 2022
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: a0549ee2a39013c6ff75b86cda9d4ccfadb0ab88
https://github.com/llvm/llvm-project/commit/a0549ee2a39013c6ff75b86cda9d4ccfadb0ab88
Author: Aaron Jacobs <jacobsa at google.com>
Date: 2022-10-21 (Fri, 21 Oct 2022)
Changed paths:
M libcxx/include/__type_traits/conjunction.h
M libcxx/test/std/utilities/meta/meta.logical/conjunction.compile.pass.cpp
M libcxx/test/std/utilities/meta/meta.logical/disjunction.compile.pass.cpp
Log Message:
-----------
[libc++] type_traits: fix short-circuiting in std::conjunction.
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.
Reviewed By: #libc, ldionne, philnik
Spies: philnik, ldionne, libcxx-commits
Differential Revision: https://reviews.llvm.org/D136318
More information about the All-commits
mailing list