diff --git a/libcxx/fuzzing/fuzzing.cpp b/libcxx/fuzzing/fuzzing.cpp index 9f3601fbf0b1af..d036f0cbb8b8f0 100644 --- a/libcxx/fuzzing/fuzzing.cpp +++ b/libcxx/fuzzing/fuzzing.cpp @@ -652,6 +652,8 @@ enum InitKind { VectorResultType }; + + template struct ParamTypeHelper { using ParamT = typename Dist::param_type; @@ -659,16 +661,24 @@ struct ParamTypeHelper { static_assert(std::is_same::value, ""); static ParamT Create(const uint8_t* data, size_t size, bool &OK) { - if constexpr (std::is_constructible::value) - return CreateVectorResult(data, size, OK); - else if constexpr (std::is_constructible::value) - return CreateVectorDouble(data, size, OK); - else - return CreateDefault(data, size, OK); + constexpr bool select_vector_result = std::is_constructible::value; + constexpr bool select_vector_double = std::is_constructible::value; + constexpr int selector = select_vector_result ? 0 : (select_vector_double ? 1 : 2); + return DispatchAndCreate(std::integral_constant{}, data, size, OK); + } + static ParamT DispatchAndCreate(std::integral_constant, const uint8_t *data, size_t size, bool &OK) { + return CreateVectorResult(data, size, OK); + } + static ParamT DispatchAndCreate(std::integral_constant, const uint8_t *data, size_t size, bool &OK) { + return CreateVectorDouble(data, size, OK); + } + static ParamT DispatchAndCreate(std::integral_constant, const uint8_t *data, size_t size, bool &OK) { + return CreateDefault(data, size, OK); + } -static ParamT +static ParamT CreateVectorResult(const uint8_t *data, size_t size, bool &OK) { auto Input = GetValues(data, size); OK = false;