From da1c135b26e19763f74e7148c240b2f4fab4b166 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Mon, 2 Mar 2020 22:27:08 +0100 Subject: [PATCH] Implement a workaround to satisfy clang Looks like clang is unable to handle this constexpr "and" condition. Splitting it fixes the problem. I was not able to create a simple reproducer to report it to the clang team... --- src/language/BuiltinFunctionEmbedder.hpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/language/BuiltinFunctionEmbedder.hpp b/src/language/BuiltinFunctionEmbedder.hpp index d6040f7be..99d76590b 100644 --- a/src/language/BuiltinFunctionEmbedder.hpp +++ b/src/language/BuiltinFunctionEmbedder.hpp @@ -54,7 +54,7 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder _copy_value(ArgsTuple& t, const std::vector<DataVariant>& v) const { std::visit( - [&](auto v_i) { + [&](auto&& v_i) { using Ti_Type = std::decay_t<decltype(std::get<I>(t))>; using Vi_Type = std::decay_t<decltype(v_i)>; @@ -63,9 +63,13 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder } else if constexpr ((std::is_arithmetic_v<Vi_Type>)and(std::is_arithmetic_v<Ti_Type> or std::is_same_v<Ti_Type, std::string>)) { std::get<I>(t) = v_i; - } else if constexpr (is_shared_ptr_v<Ti_Type> and std::is_same_v<Vi_Type, EmbeddedData>) { - auto data_handler = static_cast<const DataHandler<typename Ti_Type::element_type>&>(v_i.get()); - std::get<I>(t) = data_handler.data_ptr(); + } else if constexpr (is_shared_ptr_v<Ti_Type>) { + if constexpr (std::is_same_v<Vi_Type, EmbeddedData>) { + auto data_handler = static_cast<const DataHandler<typename Ti_Type::element_type>&>(v_i.get()); + std::get<I>(t) = data_handler.data_ptr(); + } else { + throw std::runtime_error("unexpected argument types while casting: expecting EmbeddedData"); + } } else { std::ostringstream os; os << "unexpected argument types while casting " << demangle<Vi_Type>() << " -> " << demangle<Ti_Type>() -- GitLab