diff --git a/vtkm/exec/internal/testing/UnitTestVariant.cxx b/vtkm/exec/internal/testing/UnitTestVariant.cxx index f6e5c9dd4..25dcfd32a 100644 --- a/vtkm/exec/internal/testing/UnitTestVariant.cxx +++ b/vtkm/exec/internal/testing/UnitTestVariant.cxx @@ -21,6 +21,7 @@ namespace test_variant template struct TypePlaceholder { + vtkm::IdComponent Value = Index; }; // A class that is trivially copiable but not totally trivial. @@ -313,6 +314,17 @@ struct TestFunctor } }; +struct TestFunctorModify +{ + template + void operator()(TypePlaceholder& object, vtkm::Id expectedValue) + { + VTKM_TEST_ASSERT(Index == expectedValue, "Index = ", Index, ", expected = ", expectedValue); + VTKM_TEST_ASSERT(object.Value == expectedValue); + ++object.Value; + } +}; + void TestGet() { std::cout << "Test Get" << std::endl; @@ -429,6 +441,9 @@ void TestCastAndCall() VariantType variant26{ TypePlaceholder<26>{} }; result = variant26.CastAndCall(TestFunctor(), 26); VTKM_TEST_ASSERT(test_equal(result, TestValue(26, vtkm::FloatDefault{}))); + + variant1.CastAndCall(TestFunctorModify{}, 1); + VTKM_TEST_ASSERT(variant1.Get<1>().Value == 2, "Variant object not updated."); } void TestCopyInvalid() diff --git a/vtkm/internal/VariantImpl.h b/vtkm/internal/VariantImpl.h index e11926865..5533477cc 100644 --- a/vtkm/internal/VariantImpl.h +++ b/vtkm/internal/VariantImpl.h @@ -518,8 +518,9 @@ public: } template - VTK_M_DEVICE auto CastAndCall(Functor&& f, Args&&... args) noexcept( - noexcept(f(std::declval&>(), args...))) + VTK_M_DEVICE auto CastAndCall(Functor&& f, + Args&&... args) noexcept(noexcept(f(std::declval&>(), + args...))) -> decltype(f(std::declval&>(), args...)) { VTKM_ASSERT(this->IsValid());