Remove VS2013 workarounds from VTK-m.

This commit is contained in:
Robert Maynard 2018-02-22 11:34:08 -05:00
parent 01c9d6e2a6
commit ee69c7a4b7
28 changed files with 48 additions and 174 deletions

@ -86,12 +86,6 @@ function(vtkm_setup_msvc_properties target )
# removed when doing header test builds.
target_compile_options(${target} PRIVATE -wd4702 -wd4505)
# In VS2013 the C4127 warning has a bug in the implementation and
# generates false positive warnings for lots of template code
if(MSVC_VERSION LESS 1900)
target_compile_options(${target} PRIVATE -wd4127 )
endif()
endfunction(vtkm_setup_msvc_properties)
# vtkm_target_name(<name>)

@ -61,7 +61,7 @@ VTK-m Requires:
+ GCC 4.8+
+ Clang 3.3+
+ XCode 5.0+
+ MSVC 2013+
+ MSVC 2015+
+ [CMake](http://www.cmake.org/download/)
+ CMake 3.3+ (for any build)
+ CMake 3.9+ (for CUDA build)

@ -168,8 +168,7 @@ class ExposedClass;
namespace references are preferred).
+ All code must be valid by the C++11 specifications. It must also
compile correctly with Microsoft Visual Studio 2013, which implements a
subset of the C++11 standard.
compile with Microsoft Visual Studio 2015.
+ New code must include regression tests that will run on the dashboards.
Generally a new class will have an associated "UnitTest" that will test

@ -36,7 +36,7 @@ namespace internal
template <typename ListTag>
struct ListTagCheck : std::is_base_of<vtkm::detail::ListRoot, ListTag>
{
static VTKM_CONSTEXPR bool Valid = std::is_base_of<vtkm::detail::ListRoot, ListTag>::value;
static constexpr bool Valid = std::is_base_of<vtkm::detail::ListRoot, ListTag>::value;
};
} // namespace internal
@ -111,7 +111,7 @@ template <typename ListTag, typename Type>
struct ListContains
{
VTKM_IS_LIST_TAG(ListTag);
static VTKM_CONSTEXPR bool value = detail::ListContainsImpl<Type, typename ListTag::list>::value;
static constexpr bool value = detail::ListContainsImpl<Type, typename ListTag::list>::value;
};
} // namespace vtkm

@ -87,7 +87,7 @@ struct ArrayHandleSwizzleTraits
/// A std::array containing the ComponentMap for runtime querying.
using RuntimeComponentMapType = std::array<vtkm::IdComponent, COUNT>;
static VTKM_CONSTEXPR RuntimeComponentMapType GenerateRuntimeComponentMap()
static constexpr RuntimeComponentMapType GenerateRuntimeComponentMap()
{
return RuntimeComponentMapType{ { ComponentMap... } };
}
@ -124,7 +124,7 @@ private:
template <vtkm::IdComponent OutputIndex, vtkm::IdComponent Head>
struct GetImpl<OutputIndex, Head>
{
VTKM_CONSTEXPR vtkm::IdComponent operator()() const { return OutputIndex == 0 ? Head : -1; }
constexpr vtkm::IdComponent operator()() const { return OutputIndex == 0 ? Head : -1; }
};
// Recursive case:
@ -133,17 +133,14 @@ private:
{
using Next = GetImpl<OutputIndex - 1, Tail...>;
VTKM_CONSTEXPR vtkm::IdComponent operator()() const
{
return OutputIndex == 0 ? Head : Next()();
}
constexpr vtkm::IdComponent operator()() const { return OutputIndex == 0 ? Head : Next()(); }
};
public:
/// Get the component from ComponentMap at the specified index as a
/// compile-time constant:
template <vtkm::IdComponent OutputIndex>
static VTKM_CONSTEXPR vtkm::IdComponent Get()
static constexpr vtkm::IdComponent Get()
{
return GetImpl<OutputIndex, ComponentMap...>()();
}

@ -183,15 +183,7 @@ template <typename ArrayHandleType,
typename InverseFunctorType = NullFunctorType>
struct VTKM_ALWAYS_EXPORT StorageTagTransform
{
#if defined(VTKM_MSVC) && (_MSC_VER == 1800) // workaround for VS2013
private:
using ArrayHandleValueType = typename ArrayHandleType::ValueType;
public:
using ValueType = decltype(FunctorType{}(ArrayHandleValueType{}));
#else
using ValueType = decltype(FunctorType{}(typename ArrayHandleType::ValueType{}));
#endif
};
template <typename ArrayHandleType, typename FunctorType>

@ -27,7 +27,7 @@
#include <exception>
#include <string>
#include <vtkm/internal/ExportMacros.h> // For VTKM_NOEXCEPT
#include <vtkm/internal/ExportMacros.h>
namespace vtkm
{
@ -55,7 +55,7 @@ public:
#endif
// For std::exception compatibility:
const char* what() const VTKM_NOEXCEPT override { return this->Message.c_str(); }
const char* what() const noexcept override { return this->Message.c_str(); }
protected:
Error() {}

@ -53,7 +53,7 @@ namespace internal
template <typename ControlSignatureTag>
struct ControlSignatureTagCheck
{
static VTKM_CONSTEXPR bool Valid =
static constexpr bool Valid =
std::is_base_of<vtkm::cont::arg::ControlSignatureTagBase, ControlSignatureTag>::value;
};

@ -46,7 +46,7 @@ struct TypeCheckTagExecObject
template <typename Type>
struct TypeCheck<TypeCheckTagExecObject, Type>
{
static VTKM_CONSTEXPR bool value = std::is_base_of<vtkm::exec::ExecutionObjectBase, Type>::value;
static constexpr bool value = std::is_base_of<vtkm::exec::ExecutionObjectBase, Type>::value;
};
}
}

@ -433,7 +433,7 @@ public:
const BinaryCompare& binary_compare)
{
internal::WrappedBinaryOperator<bool, BinaryCompare> wrappedCompare(binary_compare);
VTKM_CONSTEXPR bool larger_than_64bits = sizeof(U) > sizeof(vtkm::Int64);
constexpr bool larger_than_64bits = sizeof(U) > sizeof(vtkm::Int64);
if (larger_than_64bits)
{
/// More efficient sort:

@ -195,7 +195,7 @@ void parallel_sort_bykey(vtkm::cont::ArrayHandle<T, StorageT>& keys,
PSortTag)
{
using KeyType = vtkm::cont::ArrayHandle<T, StorageT>;
VTKM_CONSTEXPR bool larger_than_64bits = sizeof(U) > sizeof(vtkm::Int64);
constexpr bool larger_than_64bits = sizeof(U) > sizeof(vtkm::Int64);
if (larger_than_64bits)
{
/// More efficient sort:

@ -129,7 +129,7 @@ inline vtkm::filter::Result Gradient::DoExecute(
transpose_3x3(outArray, adapter);
}
VTKM_CONSTEXPR bool isVector = std::is_same<typename vtkm::VecTraits<T>::HasMultipleComponents,
constexpr bool isVector = std::is_same<typename vtkm::VecTraits<T>::HasMultipleComponents,
vtkm::VecTraitsTagMultipleComponents>::value;
vtkm::cont::Field::AssociationEnum fieldAssociation(this->ComputePointGradient

@ -272,7 +272,7 @@
#cmakedefine VTKM_ENABLE_MPI
#if __cplusplus >= 201103L || \
( defined(VTKM_MSVC) && _MSC_VER >= 1800 ) || \
( defined(VTKM_MSVC) && _MSC_VER >= 1900 ) || \
( defined(VTKM_ICC) && defined(__INTEL_CXX11_MODE__) )
#define VTKM_HAVE_CXX_11
#else
@ -340,17 +340,6 @@
//
#pragma warning(disable:4251)
// MSVC 2013 and earlier only:
#if _MSC_VER <= 1800
// Generates numerous warnings that implicit constructors can't
// be constructed. This is understood and we don't care.
#pragma warning(disable:4510)
// Generates numerous warnings that implicit assignment operators can't
// be constructed. This is understood and we don't care.
#pragma warning(disable:4512)
#endif // MSVC <= 2013
#endif
#endif //vtkm_internal_Configure_h

@ -77,16 +77,6 @@
#define VTKM_NEVER_EXPORT __attribute__((visibility("hidden")))
#endif
// constexpr support was added to VisualStudio 2015 and above. So this makes
// sure when that we gracefully fall back to just const when using 2013
#if defined(VTKM_MSVC) && _MSC_VER < 1900
#define VTKM_CONSTEXPR const
#define VTKM_NOEXCEPT
#else
#define VTKM_CONSTEXPR constexpr
#define VTKM_NOEXCEPT noexcept
#endif
// Clang will warn about weak vtables (-Wweak-vtables) on exception classes,
// but there's no good way to eliminate them in this case because MSVC (See
// http://stackoverflow.com/questions/24511376). These macros will silence the

@ -389,7 +389,7 @@ public:
{
this->Result = src.GetReturnValueSafe();
VTKM_CONSTEXPR vtkm::UInt16 minArity = (ARITY < FunctionInterface<SrcFunctionSignature>::ARITY)
constexpr vtkm::UInt16 minArity = (ARITY < FunctionInterface<SrcFunctionSignature>::ARITY)
? ARITY
: FunctionInterface<SrcFunctionSignature>::ARITY;
@ -774,8 +774,8 @@ public:
using interfaceSig = typename detail::AsSigType<appended>::type;
using NextInterfaceType = FunctionInterface<interfaceSig>;
static VTKM_CONSTEXPR std::size_t newArity = NextInterfaceType::ARITY;
static VTKM_CONSTEXPR std::size_t oldArity = detail::FunctionSigInfo<OriginalFunction>::Arity;
static constexpr std::size_t newArity = NextInterfaceType::ARITY;
static constexpr std::size_t oldArity = detail::FunctionSigInfo<OriginalFunction>::Arity;
typedef std::integral_constant<bool, (newArity < oldArity)> ShouldDoNextTransformType;
NextInterfaceType nextInterface = this->NewInterface.Append(newParameter);

@ -50,14 +50,14 @@ template <typename T>
struct FunctionInterfaceReturnContainer
{
T Value;
static VTKM_CONSTEXPR bool VALID = true;
static constexpr bool VALID = true;
};
template <>
struct FunctionInterfaceReturnContainer<void>
{
// Nothing to store for void return.
static VTKM_CONSTEXPR bool VALID = false;
static constexpr bool VALID = false;
};
namespace detail
@ -648,7 +648,7 @@ struct FunctionSigInfo;
template <typename R, typename... ArgTypes>
struct FunctionSigInfo<R(ArgTypes...)>
{
static VTKM_CONSTEXPR std::size_t Arity = sizeof...(ArgTypes);
static constexpr std::size_t Arity = sizeof...(ArgTypes);
using ArityType = std::integral_constant<int, static_cast<int>(Arity)>;
using ResultType = R;

@ -96,14 +96,14 @@ template <typename T>
struct FunctionInterfaceReturnContainer
{
T Value;
static VTKM_CONSTEXPR bool VALID = true;
static constexpr bool VALID = true;
};
template <>
struct FunctionInterfaceReturnContainer<void>
{
// Nothing to store for void return.
static VTKM_CONSTEXPR bool VALID = false;
static constexpr bool VALID = false;
};
namespace detail
@ -139,7 +139,7 @@ struct FunctionSigInfo;
template <typename R, typename... ArgTypes>
struct FunctionSigInfo<R(ArgTypes...)>
{
static VTKM_CONSTEXPR std::size_t Arity = sizeof...(ArgTypes);
static constexpr std::size_t Arity = sizeof...(ArgTypes);
using ArityType = std::integral_constant<int, static_cast<int>(Arity)>;
using ResultType = R;

@ -80,35 +80,35 @@ struct ListContainsImpl;
template <typename Type>
struct ListContainsImpl<Type, brigand::empty_sequence>
{
static VTKM_CONSTEXPR bool value = false;
static constexpr bool value = false;
};
//-----------------------------------------------------------------------------
template <typename Type>
struct ListContainsImpl<Type, brigand::list<vtkm::detail::UniversalTag>>
{
static VTKM_CONSTEXPR bool value = true;
static constexpr bool value = true;
};
//-----------------------------------------------------------------------------
template <typename Type, typename T1>
struct ListContainsImpl<Type, brigand::list<T1>>
{
static VTKM_CONSTEXPR bool value = std::is_same<Type, T1>::value;
static constexpr bool value = std::is_same<Type, T1>::value;
};
//-----------------------------------------------------------------------------
template <typename Type, typename T1, typename T2>
struct ListContainsImpl<Type, brigand::list<T1, T2>>
{
static VTKM_CONSTEXPR bool value = std::is_same<Type, T1>::value || std::is_same<Type, T2>::value;
static constexpr bool value = std::is_same<Type, T1>::value || std::is_same<Type, T2>::value;
};
//-----------------------------------------------------------------------------
template <typename Type, typename T1, typename T2, typename T3>
struct ListContainsImpl<Type, brigand::list<T1, T2, T3>>
{
static VTKM_CONSTEXPR bool value =
static constexpr bool value =
std::is_same<Type, T1>::value || std::is_same<Type, T2>::value || std::is_same<Type, T3>::value;
};
@ -116,8 +116,8 @@ struct ListContainsImpl<Type, brigand::list<T1, T2, T3>>
template <typename Type, typename T1, typename T2, typename T3, typename T4>
struct ListContainsImpl<Type, brigand::list<T1, T2, T3, T4>>
{
static VTKM_CONSTEXPR bool value = std::is_same<Type, T1>::value ||
std::is_same<Type, T2>::value || std::is_same<Type, T3>::value || std::is_same<Type, T4>::value;
static constexpr bool value = std::is_same<Type, T1>::value || std::is_same<Type, T2>::value ||
std::is_same<Type, T3>::value || std::is_same<Type, T4>::value;
};
//-----------------------------------------------------------------------------
@ -126,7 +126,7 @@ struct ListContainsImpl
{
using find_result = brigand::find<List, std::is_same<brigand::_1, Type>>;
using size = brigand::size<find_result>;
static VTKM_CONSTEXPR bool value = (size::value != 0);
static constexpr bool value = (size::value != 0);
};
//-----------------------------------------------------------------------------
@ -213,30 +213,7 @@ VTKM_CONT void ListForEachImpl(Functor&& f,
template <typename R1, typename R2>
struct ListCrossProductImpl
{
#if defined(VTKM_MSVC) && _MSC_VER == 1800
// This is a Cartesian product generator that is used
// when building with visual studio 2013. Visual Studio
// 2013 is unable to handle the lazy version as it can't
// deduce the correct template parameters
using type = brigand::reverse_fold<
brigand::list<R1, R2>,
brigand::list<brigand::list<>>,
brigand::bind<
brigand::join,
brigand::bind<
brigand::transform,
brigand::_2,
brigand::defer<brigand::bind<
brigand::join,
brigand::bind<
brigand::transform,
brigand::parent<brigand::_1>,
brigand::defer<brigand::bind<
brigand::list,
brigand::bind<brigand::push_front, brigand::_1, brigand::parent<brigand::_1>>>>>>>>>>;
#else
// This is a lazy Cartesian product generator that is used
// when using any compiler other than visual studio 2013.
// This is a lazy Cartesian product generator.
// This version was settled on as being the best default
// version as all compilers including Intel handle this
// implementation without issue for very large cross products
@ -250,7 +227,6 @@ struct ListCrossProductImpl
brigand::defer<brigand::bind<
brigand::list,
brigand::lazy::push_front<brigand::_1, brigand::parent<brigand::_1>>>>>>>>>>;
#endif
};

@ -14,8 +14,6 @@
#define BRIGAND_COMP_MSVC
#if _MSC_VER == 1900
#define BRIGAND_COMP_MSVC_2015
#elif _MSC_VER == 1800
#define BRIGAND_COMP_MSVC_2013
#endif
#elif __INTEL_COMPILER
#define BRIGAND_COMP_INTEL
@ -902,7 +900,7 @@ namespace detail
#include <initializer_list>
namespace brigand
{
#if defined(BRIGAND_COMP_MSVC_2013) || defined(BRIGAND_COMP_CUDA) || defined(BRIGAND_COMP_INTEL)
#if defined(BRIGAND_COMP_CUDA) || defined(BRIGAND_COMP_INTEL)
namespace detail
{
template<class P, class T>
@ -961,7 +959,7 @@ namespace brigand
}
namespace brigand
{
#if defined(BRIGAND_COMP_MSVC_2013) || defined(BRIGAND_COMP_CUDA) || defined(BRIGAND_COMP_INTEL)
#if defined(BRIGAND_COMP_CUDA) || defined(BRIGAND_COMP_INTEL)
namespace detail
{
template<typename T>
@ -1522,9 +1520,7 @@ namespace brigand
namespace detail
{
template<class, class T> struct unique_x_t
#ifdef BRIGAND_COMP_MSVC_2013
{ operator T (); };
#elif defined(BRIGAND_COMP_GCC)
#if defined(BRIGAND_COMP_GCC)
: type_<T>
{};
#else
@ -1545,39 +1541,11 @@ namespace detail
template<class... Us>
static auto is_set(Us...) -> decltype(true_fn(static_cast<Us>(Pack())...));
static std::false_type is_set(...);
#ifdef BRIGAND_COMP_MSVC_2013
using type = decltype(is_set(Ts()...));
#else
using type = decltype(is_set(type_<Ts>()...));
#endif
};
#ifdef BRIGAND_COMP_MSVC_2013
template<class> struct qrref {};
template<class> struct qref {};
template<class> struct qnoref {};
template<class T>
struct msvc_quali_ref
{
using type = qnoref<T>;
};
template<class T>
struct msvc_quali_ref<T&>
{
using type = qref<T>;
};
template<class T>
struct msvc_quali_ref<T&&>
{
using type = qrref<T>;
};
#endif
}
template<class... Ts>
#ifdef BRIGAND_COMP_MSVC_2013
using is_set = typename detail::is_set_impl<range<int, 0, static_cast<int>(sizeof...(Ts))>, detail::msvc_quali_ref<Ts>...>::type;
#else
using is_set = typename detail::is_set_impl<range<int, 0, static_cast<int>(sizeof...(Ts))>, Ts...>::type;
#endif
}
#include <type_traits>
namespace brigand

@ -186,7 +186,7 @@ vtkm::cont::DynamicArrayHandle CreateDynamicArrayHandle(const std::vector<T>& ve
case 1:
{
using CommonType = typename ClosestCommonType<T>::Type;
VTKM_CONSTEXPR bool not_same = !std::is_same<T, CommonType>::value;
constexpr bool not_same = !std::is_same<T, CommonType>::value;
if (not_same)
{
std::cerr << "Type " << vtkm::io::internal::DataTypeName<T>::Name()
@ -209,7 +209,7 @@ vtkm::cont::DynamicArrayHandle CreateDynamicArrayHandle(const std::vector<T>& ve
using InComponentType = typename vtkm::VecTraits<T>::ComponentType;
using OutComponentType = typename ClosestFloat<InComponentType>::Type;
using CommonType = vtkm::Vec<OutComponentType, 3>;
VTKM_CONSTEXPR bool not_same = !std::is_same<T, CommonType>::value;
constexpr bool not_same = !std::is_same<T, CommonType>::value;
if (not_same)
{
std::cerr << "Type " << vtkm::io::internal::DataTypeName<InComponentType>::Name() << "["

@ -23,9 +23,6 @@
#include <vtkm/rendering/vtkm_rendering_export.h>
#include <vtkm/Range.h>
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf _snprintf
#endif
#include <vtkm/cont/DataSet.h>
#include <vtkm/rendering/AxisAnnotation.h>

@ -519,7 +519,7 @@ static inline VTKM_EXEC_CONT bool test_equal(bool bool1, bool bool2)
template <typename T>
static inline VTKM_EXEC_CONT T TestValue(vtkm::Id index, T, vtkm::TypeTraitsIntegerTag)
{
VTKM_CONSTEXPR bool larger_than_2bytes = sizeof(T) > 2;
constexpr bool larger_than_2bytes = sizeof(T) > 2;
if (larger_than_2bytes)
{
return T(index * 100);

@ -119,7 +119,7 @@ void CheckContains(TestClass<N>, ListTag, const std::vector<int>& contents)
//Use intersect to verify at compile time that ListTag contains TestClass<N>
using intersectWith = vtkm::ListTagBase<TestClass<N>>;
using intersectResult = typename vtkm::ListTagIntersect<intersectWith, ListTag>::list;
VTKM_CONSTEXPR bool intersectContains = (brigand::size<intersectResult>::value != 0);
constexpr bool intersectContains = (brigand::size<intersectResult>::value != 0);
bool listContains = vtkm::ListContains<ListTag, TestClass<N>>::value;
bool shouldContain = std::find(contents.begin(), contents.end(), N) != contents.end();
@ -135,8 +135,8 @@ void CheckContains(TestClass<N>, TestListTagUniversal, const std::vector<int>&)
using intersectWith = vtkm::ListTagBase<TestClass<N>>;
using intersectResult =
typename vtkm::ListTagIntersect<intersectWith, TestListTagUniversal>::list;
VTKM_CONSTEXPR bool intersectContains = (brigand::size<intersectResult>::value != 0);
VTKM_CONSTEXPR bool listContains = vtkm::ListContains<TestListTagUniversal, TestClass<N>>::value;
constexpr bool intersectContains = (brigand::size<intersectResult>::value != 0);
constexpr bool listContains = vtkm::ListContains<TestListTagUniversal, TestClass<N>>::value;
VTKM_TEST_ASSERT(intersectContains == listContains, "ListTagIntersect check failed.");
}

@ -324,7 +324,7 @@ template <typename T, int Size>
void SingularMatrix(vtkm::Matrix<T, Size, Size>& singularMatrix)
{
FOR_ROW_COL(singularMatrix) { singularMatrix(row, col) = static_cast<T>(row + col); }
VTKM_CONSTEXPR bool larger_than_1 = Size > 1;
constexpr bool larger_than_1 = Size > 1;
if (larger_than_1)
{
vtkm::MatrixSetRow(singularMatrix, 0, vtkm::MatrixGetRow(singularMatrix, (Size + 1) / 2));

@ -167,7 +167,7 @@ template <int Neighborhood_>
class WorkletPointNeighborhood : public WorkletPointNeighborhoodBase
{
public:
static VTKM_CONSTEXPR vtkm::IdComponent Neighborhood = Neighborhood_;
static constexpr vtkm::IdComponent Neighborhood = Neighborhood_;
/// \brief A control signature tag for neighborhood input values.
///

@ -171,49 +171,21 @@ struct GradientVecOutput : public vtkm::exec::ExecutionObjectBase
template <typename T, typename DeviceAdapter>
struct GradientOutput : public GradientScalarOutput<T, DeviceAdapter>
{
#if defined(VTKM_MSVC) && (_MSC_VER == 1800) // workaround for VS2013
template <typename... Args>
GradientOutput(Args&&... args)
: GradientScalarOutput<T, DeviceAdapter>::GradientScalarOutput(std::forward<Args>(args)...)
{
}
#else
using GradientScalarOutput<T, DeviceAdapter>::GradientScalarOutput;
#endif
};
template <typename DeviceAdapter>
struct GradientOutput<vtkm::Vec<vtkm::Float32, 3>, DeviceAdapter>
: public GradientVecOutput<vtkm::Vec<vtkm::Float32, 3>, DeviceAdapter>
{
#if defined(VTKM_MSVC) && (_MSC_VER == 1800) // workaround for VS2013
template <typename... Args>
GradientOutput(Args&&... args)
: GradientVecOutput<vtkm::Vec<vtkm::Float32, 3>, DeviceAdapter>::GradientVecOutput(
std::forward<Args>(args)...)
{
}
#else
using GradientVecOutput<vtkm::Vec<vtkm::Float32, 3>, DeviceAdapter>::GradientVecOutput;
#endif
};
template <typename DeviceAdapter>
struct GradientOutput<vtkm::Vec<vtkm::Float64, 3>, DeviceAdapter>
: public GradientVecOutput<vtkm::Vec<vtkm::Float64, 3>, DeviceAdapter>
{
#if defined(VTKM_MSVC) && (_MSC_VER == 1800) // workaround for VS2013
template <typename... Args>
GradientOutput(Args&&... args)
: GradientVecOutput<vtkm::Vec<vtkm::Float64, 3>, DeviceAdapter>::GradientVecOutput(
std::forward<Args>(args)...)
{
}
#else
using GradientVecOutput<vtkm::Vec<vtkm::Float64, 3>, DeviceAdapter>::GradientVecOutput;
#endif
};
}
} // namespace vtkm::exec

@ -114,7 +114,7 @@ struct DetermineHasCorrectParameters
using ControlSignatureTag = typename brigand::at_c<SigTypes, State::value>;
using TypeCheckTag = typename ControlSignatureTag::TypeCheckTag;
static VTKM_CONSTEXPR bool isCorrect = vtkm::cont::arg::TypeCheck<TypeCheckTag, T>::value;
static constexpr bool isCorrect = vtkm::cont::arg::TypeCheck<TypeCheckTag, T>::value;
// If you get an error on the line below, that means that your code has called the
// Invoke method on a dispatcher, and one of the arguments of the Invoke is the wrong

@ -59,7 +59,7 @@ struct Gaussian : public KernelBase<Gaussian<Dimensions>>
//---------------------------------------------------------------------
// return the multiplier between smoothing length and max cutoff distance
VTKM_EXEC_CONT
VTKM_CONSTEXPR double getDilationFactor() const { return 5.0; }
constexpr double getDilationFactor() const { return 5.0; }
//---------------------------------------------------------------------
// compute w(h) for the given distance