From dcf4119b2fd8c0ac02e2daa6a70e242207651c4b Mon Sep 17 00:00:00 2001
From: Wim Lavrijsen <wlav@pc3-wlav.lbl.gov>
Date: Fri, 17 May 2013 12:58:43 -0700
Subject: [PATCH] Cling workaround: special case to resolve string <->
 basic_string<char>

---
 bindings/pyroot/src/Converters.cxx         |  2 +-
 bindings/pyroot/src/RootWrapper.cxx        | 11 +++++++++--
 bindings/pyroot/src/TConstructorHolder.cxx |  4 +++-
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/bindings/pyroot/src/Converters.cxx b/bindings/pyroot/src/Converters.cxx
index 7d944867160..5dcdff56f30 100644
--- a/bindings/pyroot/src/Converters.cxx
+++ b/bindings/pyroot/src/Converters.cxx
@@ -504,7 +504,7 @@ Bool_t PyROOT::TCStringConverter::SetArg(
 
 // set the value and declare success
    if ( func )
-      gInterpreter->CallFunc_SetArg( func,  reinterpret_cast< Long_t >( fBuffer.c_str() ) );
+      gInterpreter->CallFunc_SetArg( func, (Long_t)fBuffer.c_str() );
    return kTRUE;
 }
 
diff --git a/bindings/pyroot/src/RootWrapper.cxx b/bindings/pyroot/src/RootWrapper.cxx
index 2cec9a9efef..ec58a48a409 100644
--- a/bindings/pyroot/src/RootWrapper.cxx
+++ b/bindings/pyroot/src/RootWrapper.cxx
@@ -230,8 +230,15 @@ int PyROOT::BuildRootClassDict( const TScopeAdapter& klass, PyObject* pyclass )
 
    // special case trackers
       Bool_t setupSetItem = kFALSE;
-      Bool_t isConstructor =
-         TClassEdit::ShortType( mtName.c_str(), TClassEdit::kDropAlloc ) == clName;
+   // CLING WORKAROUND --
+      Bool_t isConstructor = kFALSE;
+      if ( clName == "string" ) {
+         isConstructor = mtName == "basic_string<char>";
+      } else {
+   // -- CLING WORKAROUND
+         isConstructor =
+            TClassEdit::ShortType( mtName.c_str(), TClassEdit::kDropAlloc ) == clName;
+      }
 
    // filter empty names (happens for namespaces, is bug?)
       if ( mtName == "" )
diff --git a/bindings/pyroot/src/TConstructorHolder.cxx b/bindings/pyroot/src/TConstructorHolder.cxx
index 2c72d8bdffa..aa99743c8db 100644
--- a/bindings/pyroot/src/TConstructorHolder.cxx
+++ b/bindings/pyroot/src/TConstructorHolder.cxx
@@ -86,8 +86,10 @@ PyObject* PyROOT::TConstructorHolder::operator()(
 // CLING WORKAROUND --
 // Due to #100389, the constructor may not be a valid method. This happens if
 // there is no (default) contructor, so just return a right-size bit of memory.
-   if ( ! address )
+   if ( ! address ) {
+      PyErr_Clear();
       address = (Long_t)klass->New();
+   }
 // -- END CLING WORKAROUND
 
 // done with filtered args
-- 
GitLab