diff options
| author | Szapi | 2025-08-23 21:55:38 +0200 |
|---|---|---|
| committer | GitHub | 2025-08-23 21:55:38 +0200 |
| commit | 85c4bad86b0bd29b6d2f5aa270401c0a642d53b1 (patch) | |
| tree | 9f905f9cb9b2a0000760dc58880e956db2acfddd /src/catch2/generators | |
| parent | 582200a1f8ddd6f435d1264668c7074121c2636c (diff) | |
| download | catch3-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/generators')
| -rw-r--r-- | src/catch2/generators/catch_generators_adapters.hpp | 5 |
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> |