diff --git a/include/chaiscript/dispatchkit/boxed_cast_helper.hpp b/include/chaiscript/dispatchkit/boxed_cast_helper.hpp index b4e1826..da1e222 100644 --- a/include/chaiscript/dispatchkit/boxed_cast_helper.hpp +++ b/include/chaiscript/dispatchkit/boxed_cast_helper.hpp @@ -176,6 +176,8 @@ namespace chaiscript template struct Cast_Helper_Inner &> { + static_assert(!std::is_const::value, "Non-const reference to std::shared_ptr is not supported"); + typedef Boxed_Value::Sentinel Result_Type; static Result_Type cast(const Boxed_Value &ob, const Type_Conversions_State *) @@ -185,6 +187,7 @@ namespace chaiscript } }; + /// Cast_Helper_Inner for casting to a const std::shared_ptr & type template struct Cast_Helper_Inner > : Cast_Helper_Inner > diff --git a/unittests/boxed_cast_test.cpp b/unittests/boxed_cast_test.cpp index 1e92874..11978ef 100644 --- a/unittests/boxed_cast_test.cpp +++ b/unittests/boxed_cast_test.cpp @@ -54,12 +54,13 @@ bool test_type_conversion(const Boxed_Value &bv, bool expectedpass) } template -bool do_test(const Boxed_Value &bv, bool T, bool ConstT, bool TRef, bool ConstTRef, bool TPtr, bool ConstTPtr, bool TPtrConst, - bool ConstTPtrConst, bool SharedPtrT, bool SharedConstPtrT, - bool ConstSharedPtrT, bool ConstSharedConstPtrT, bool ConstSharedPtrTRef, bool ConstSharedPtrTConstRef, - bool WrappedRef, bool WrappedConstRef, bool ConstWrappedRef, bool ConstWrappedConstRef, - bool ConstWrappedRefRef, bool ConstWrappedConstRefRef, bool Number, - bool ConstNumber, bool ConstNumberRef, bool TPtrConstRef, bool ConstTPtrConstRef) +bool do_test(const Boxed_Value &bv, + bool T, bool ConstT, bool TRef, bool ConstTRef, bool TPtr, + bool ConstTPtr, bool TPtrConst, bool ConstTPtrConst, bool SharedPtrT, bool SharedConstPtrT, + bool SharedPtrTRef, bool ConstSharedPtrT, bool ConstSharedConstPtrT, bool ConstSharedPtrTRef, bool ConstSharedPtrTConstRef, + bool WrappedRef, bool WrappedConstRef, bool ConstWrappedRef, bool ConstWrappedConstRef, bool ConstWrappedRefRef, + bool ConstWrappedConstRefRef, bool Number, bool ConstNumber, bool ConstNumberRef, bool TPtrConstRef, + bool ConstTPtrConstRef) { bool passed = true; passed &= test_type_conversion(bv, T); @@ -72,8 +73,8 @@ bool do_test(const Boxed_Value &bv, bool T, bool ConstT, bool TRef, bool ConstTR passed &= test_type_conversion(bv, ConstTPtrConst); passed &= test_type_conversion >(bv, SharedPtrT); passed &= test_type_conversion >(bv, SharedConstPtrT); - passed &= test_type_conversion &>(bv, false); - passed &= test_type_conversion &>(bv, false); + passed &= test_type_conversion &>(bv, SharedPtrTRef); + //passed &= test_type_conversion &>(bv, false); passed &= test_type_conversion >(bv, ConstSharedPtrT); passed &= test_type_conversion >(bv, ConstSharedConstPtrT); passed &= test_type_conversion &>(bv, ConstSharedPtrTRef); @@ -115,37 +116,37 @@ bool built_in_type_test(const T &initial, bool ispod) T i = T(initial); passed &= do_test(var(i), true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, ispod, ispod, ispod, true, true); passed &= do_test(const_var(i), true, true, false, true, false, true, false, true, false, true, - false, true, false, true, false, + false, false, true, false, true, false, true, false, true, false, true, ispod, ispod, ispod, false, true); passed &= do_test(var(&i), true, true, true, true, true, true, true, true, false, false, - false, false, false, false, true, + false, false, false, false, false, true, true, true, true, true, true, ispod, ispod, ispod, true, true); passed &= do_test(const_var(&i), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); passed &= do_test(var(std::ref(i)), true, true, true, true, true, true, true, true, false, false, - false, false, false, false, true, + false, false, false, false, false, true, true, true, true, true, true, ispod, ispod, ispod, true, true); passed &= do_test(var(std::cref(i)), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); @@ -156,33 +157,33 @@ bool built_in_type_test(const T &initial, bool ispod) passed &= do_test(var(i), true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, ispod, ispod, ispod, true, true); // But a pointer or reference to it should be necessarily const passed &= do_test(var(&ir), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); passed &= do_test(var(std::ref(ir)), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); // Make sure const of const works too passed &= do_test(const_var(&ir), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); passed &= do_test(const_var(std::ref(ir)), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); @@ -192,14 +193,14 @@ bool built_in_type_test(const T &initial, bool ispod) const T*cip = &i; passed &= do_test(var(cip), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); // make sure const of const works passed &= do_test(const_var(cip), true, true, false, true, false, true, false, true, false, false, - false, false, false, false, false, + false, false, false, false, false, false, true, false, true, false, true, ispod, ispod, ispod, false, true); @@ -209,13 +210,13 @@ bool built_in_type_test(const T &initial, bool ispod) passed &= do_test(var(ip), true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, ispod, ispod, ispod, true, true); passed &= do_test(const_var(ip), true, true, false, true, false, true, false, true, false, true, - false, true, false, true, false, + false, false, true, false, true, false, true, false, true, false, true, ispod, ispod, ispod, false, true); @@ -224,14 +225,14 @@ bool built_in_type_test(const T &initial, bool ispod) passed &= do_test(var(ipc), true, true, false, true, false, true, false, true, false, true, - false, true, false, true, false, + false, false, true, false, true, false, true, false, true, false, true, ispod, ispod, ispod, false, true); // const of this should be the same, making sure it compiles passed &= do_test(const_var(ipc), true, true, false, true, false, true, false, true, false, true, - false, true, false, true, false, + false, false, true, false, true, false, true, false, true, false, true, ispod, ispod, ispod, false, true);