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