From 4cc9b650c57e7aa12e715e0f163120b19a0f249b Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 15 May 2019 08:25:11 -0700 Subject: [PATCH] getSubField() fail to compile when T isn't PVField or a sub-class --- src/pv/pvData.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/pv/pvData.h b/src/pv/pvData.h index 59a0eac..40d2564 100644 --- a/src/pv/pvData.h +++ b/src/pv/pvData.h @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -237,6 +239,7 @@ public: void copyUnchecked(const PVField& from); static size_t num_instances; // use atomic::get() or volatile* access + enum {isPVField=1}; protected: PVField::shared_pointer getPtrSelf() { @@ -762,12 +765,14 @@ public: template inline std::tr1::shared_ptr getSubField(A a) { + STATIC_ASSERT(PVD::isPVField); // only allow cast from PVField sub-class return std::tr1::dynamic_pointer_cast(getSubFieldImpl(a, false)); } template inline std::tr1::shared_ptr getSubField(A a) const { + STATIC_ASSERT(PVD::isPVField); // only allow cast from PVField sub-class return std::tr1::dynamic_pointer_cast(getSubFieldImpl(a, false)); } @@ -800,6 +805,7 @@ public: template inline std::tr1::shared_ptr getSubFieldT(A a) { + STATIC_ASSERT(PVD::isPVField); // only allow cast from PVField sub-class std::tr1::shared_ptr ret(std::tr1::dynamic_pointer_cast(getSubFieldImpl(a, true))); if(!ret) throwBadFieldType(a); @@ -809,6 +815,7 @@ public: template inline std::tr1::shared_ptr getSubFieldT(A a) const { + STATIC_ASSERT(PVD::isPVField); // only allow cast from PVField sub-class std::tr1::shared_ptr ret(std::tr1::dynamic_pointer_cast(getSubFieldImpl(a, true))); if(!ret) throwBadFieldType(a); @@ -963,11 +970,13 @@ public: template inline std::tr1::shared_ptr get() { + STATIC_ASSERT(PVT::isPVField); // only allow cast from PVField sub-class return std::tr1::dynamic_pointer_cast(get()); } template inline std::tr1::shared_ptr get() const { + STATIC_ASSERT(PVT::isPVField); // only allow cast from PVField sub-class return std::tr1::dynamic_pointer_cast(get()); } @@ -981,6 +990,7 @@ public: template inline std::tr1::shared_ptr select(int32 index) { + STATIC_ASSERT(PVT::isPVField); // only allow cast from PVField sub-class return std::tr1::dynamic_pointer_cast(select(index)); }