Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/src/catch2
diff options
context:
space:
mode:
authorSzapi2025-08-23 21:55:38 +0200
committerGitHub2025-08-23 21:55:38 +0200
commit85c4bad86b0bd29b6d2f5aa270401c0a642d53b1 (patch)
tree9f905f9cb9b2a0000760dc58880e956db2acfddd /src/catch2
parent582200a1f8ddd6f435d1264668c7074121c2636c (diff)
downloadcatch3-85c4bad86b0bd29b6d2f5aa270401c0a642d53b1.tar.gz
Forbid deducing reference types for m_predicate in FilterGenerator (#3005)
Forbid deducing reference types for m_predicate in FilterGenerator to prevent dangling references. This is needed for out-of-line predicates to work correctly instead of undefined behavior or crashes. --------- Co-authored-by: Tek Mate <mate.tek@evosoft.com>
Diffstat (limited to 'src/catch2')
-rw-r--r--src/catch2/generators/catch_generators_adapters.hpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/catch2/generators/catch_generators_adapters.hpp b/src/catch2/generators/catch_generators_adapters.hpp
index d5fc1e12..f623bd29 100644
--- a/src/catch2/generators/catch_generators_adapters.hpp
+++ b/src/catch2/generators/catch_generators_adapters.hpp
@@ -58,8 +58,9 @@ namespace Generators {
class FilterGenerator final : public IGenerator<T> {
GeneratorWrapper<T> m_generator;
Predicate m_predicate;
+ static_assert(!std::is_reference<Predicate>::value, "This would most likely result in a dangling reference");
public:
- template <typename P = Predicate>
+ template <typename P>
FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):
m_generator(CATCH_MOVE(generator)),
m_predicate(CATCH_FORWARD(pred))
@@ -91,7 +92,7 @@ namespace Generators {
template <typename T, typename Predicate>
GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) {
- return GeneratorWrapper<T>(Catch::Detail::make_unique<FilterGenerator<T, Predicate>>(CATCH_FORWARD(pred), CATCH_MOVE(generator)));
+ return GeneratorWrapper<T>(Catch::Detail::make_unique<FilterGenerator<T, typename std::remove_reference<Predicate>::type>>(CATCH_FORWARD(pred), CATCH_MOVE(generator)));
}
template <typename T>