From c1026e00046b9c11e7846aab6f558780bf9fab5c Mon Sep 17 00:00:00 2001
From: Axel Naumann <Axel.Naumann@cern.ch>
Date: Tue, 1 Dec 2015 14:47:21 +0100
Subject: [PATCH] ROOT-7825: dereference address for "*&".

---
 bindings/pyroot/src/Converters.cxx | 4 ++--
 bindings/pyroot/src/Converters.h   | 6 +++++-
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/bindings/pyroot/src/Converters.cxx b/bindings/pyroot/src/Converters.cxx
index f14f6217ef6..2648630120d 100644
--- a/bindings/pyroot/src/Converters.cxx
+++ b/bindings/pyroot/src/Converters.cxx
@@ -1021,7 +1021,7 @@ Bool_t PyROOT::TCppObjectPtrConverter::SetArg(
 
    // set pointer (may be null) and declare success
       para.fValue.fVoidp = &((ObjectProxy*)pyobject)->fObject;
-      para.fTypeCode = 'p';
+      para.fTypeCode = fIsReference ? 'V' : 'p';
       return kTRUE;
    }
 
@@ -1372,7 +1372,7 @@ PyROOT::TConverter* PyROOT::CreateConverter( const std::string& fullType, Long_t
         else
           // -- CLING WORKAROUND
         if ( cpd == "**" || cpd == "*&" || cpd == "&*" )
-          result = new TCppObjectPtrConverter( klass, control );
+          result = new TCppObjectPtrConverter( klass, control, cpd[1] == '&');
         else if ( cpd == "*" && size <= 0 )
           result = new TCppObjectConverter( klass, control );
         else if ( cpd == "&" )
diff --git a/bindings/pyroot/src/Converters.h b/bindings/pyroot/src/Converters.h
index b19d03e3773..1b4d61b5ce5 100644
--- a/bindings/pyroot/src/Converters.h
+++ b/bindings/pyroot/src/Converters.h
@@ -209,12 +209,16 @@ namespace PyROOT {
 
    class TCppObjectPtrConverter : public TCppObjectConverter {
    public:
-      using TCppObjectConverter::TCppObjectConverter;
+      TCppObjectPtrConverter( Cppyy::TCppType_t klass, Bool_t keepControl, Bool_t isReference) :
+         TCppObjectConverter(klass, keepControl),
+         fIsReference(isReference) {}
 
    public:
       virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
       virtual PyObject* FromMemory( void* address );
       virtual Bool_t ToMemory( PyObject* value, void* address );
+   protected:
+      Bool_t fIsReference;
    };
 
    class TCppObjectArrayConverter : public TCppObjectConverter {
-- 
GitLab