From f1c594fa8e022afccd0de1d2c02a3bcb10057e4c Mon Sep 17 00:00:00 2001 From: Enrico Guiraud Date: Wed, 17 Feb 2021 16:05:21 +0100 Subject: [PATCH 1/3] [IO] Deprecate historical copies of ROOT::ESTLtype A few classes have redundant declarations of `ESTLType` or `ESTLtype` enums, that over time have been centralized in `ROOT::ESTLType`. This patch deprecates usage of the historical copies in favor of the common `ROOT::ESTLType`. --- README/ReleaseNotes/v642/index.md | 3 ++- core/foundation/inc/TClassEdit.h | 32 +++++++++++++++---------------- core/meta/inc/TDictionary.h | 30 ++++++++++++++--------------- core/meta/inc/TStreamerElement.h | 32 +++++++++++++++---------------- 4 files changed, 49 insertions(+), 48 deletions(-) diff --git a/README/ReleaseNotes/v642/index.md b/README/ReleaseNotes/v642/index.md index f54e8f6cc0bc8..cd290593ce63b 100644 --- a/README/ReleaseNotes/v642/index.md +++ b/README/ReleaseNotes/v642/index.md @@ -46,6 +46,7 @@ The following people have contributed to this new version: * The ROOT **auth** package together with `TVirtualAuth` and `TROOT::GetListOfSecContexts()`, and the **authenticated sockets** (`TSocket::CreateAuthSocket()`) feature are now removed following deprecation in ROOT 6.40. * The `TSSLSocket` class is now removed following deprecation in ROOT 6.40. * The bindings to the R programming language that are enabled with the `r=ON` or `tmva-rmva=ON` build options (`TRInterface`, RMVA, and friends) are removed, following deprecation in ROOT 6.40. Their maintenance is no longer justified, given the broader adoption of the scientific Python ecosystem. Users who still rely on R from C++ are encouraged to call R directly via https://cran.r-project.org/package=RInside, which is what the ROOT bindings were using internally. +* Several enums that are redundant with `ROOT::ESTLType` are deprecated and will be removed in ROOT 6.44: `TClassEdit::ESTLType`, `TDictionary::ESTLType`, `TStreamerElement::ESTLType`. Please use `ROOT::ESTLType` instead. ## Python Interface @@ -83,4 +84,4 @@ If the vectorized backend does not work for a given use case, **please report it The version of the following packages has been updated: - - xrootd: 5.9.5 \ No newline at end of file + - xrootd: 5.9.5 diff --git a/core/foundation/inc/TClassEdit.h b/core/foundation/inc/TClassEdit.h index ee69d729cf7fa..b407dd37e7134 100644 --- a/core/foundation/inc/TClassEdit.h +++ b/core/foundation/inc/TClassEdit.h @@ -91,22 +91,22 @@ namespace TClassEdit { kDropHash = 1<<13 /* Drop the hash if applies to the collection */ }; - enum ESTLType { - kNotSTL = ROOT::kNotSTL, - kVector = ROOT::kSTLvector, - kList = ROOT::kSTLlist, - kForwardlist = ROOT::kSTLforwardlist, - kDeque = ROOT::kSTLdeque, - kMap = ROOT::kSTLmap, - kMultiMap = ROOT::kSTLmultimap, - kSet = ROOT::kSTLset, - kMultiSet = ROOT::kSTLmultiset, - kUnorderedSet = ROOT::kSTLunorderedset, - kUnorderedMultiSet = ROOT::kSTLunorderedmultiset, - kUnorderedMap = ROOT::kSTLunorderedmap, - kUnorderedMultiMap = ROOT::kSTLunorderedmultimap, - kBitSet = ROOT::kSTLbitset, - kEnd = ROOT::kSTLend + enum R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") ESTLType { + kNotSTL R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kNotSTL, + kVector R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLvector, + kList R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLlist, + kForwardlist R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLforwardlist, + kDeque R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLdeque, + kMap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmap, + kMultiMap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmultimap, + kSet R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLset, + kMultiSet R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmultiset, + kUnorderedSet R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedset, + kUnorderedMultiSet R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmultiset, + kUnorderedMap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmap, + kUnorderedMultiMap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmultimap, + kBitSet R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLbitset, + kEnd R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLend }; enum class EComplexType : short { diff --git a/core/meta/inc/TDictionary.h b/core/meta/inc/TDictionary.h index 1d2d651817ba2..a63db53a4caa8 100644 --- a/core/meta/inc/TDictionary.h +++ b/core/meta/inc/TDictionary.h @@ -195,21 +195,21 @@ class TDictionary : public TNamed { static TDictionary* GetDictionary(const std::type_info &typeinfo); // Type of STL container (returned by IsSTLContainer). - enum ESTLType { - kNone = ROOT::kNotSTL, - kVector = ROOT::kSTLvector, - kList = ROOT::kSTLlist, - kForwardlist = ROOT::kSTLforwardlist, - kDeque = ROOT::kSTLdeque, - kMap = ROOT::kSTLmap, - kMultimap = ROOT::kSTLmultimap, - kSet = ROOT::kSTLset, - kMultiset = ROOT::kSTLmultiset, - kUnorderedSet = ROOT::kSTLunorderedset, - kUnorderedMultiset = ROOT::kSTLunorderedmultiset, - kUnorderedMap = ROOT::kSTLunorderedmap, - kUnorderedMultimap = ROOT::kSTLunorderedmultimap, - kBitset = ROOT::kSTLbitset + enum R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") ESTLType { + kNone R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kNotSTL, + kVector R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLvector, + kList R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLlist, + kForwardlist R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLforwardlist, + kDeque R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLdeque, + kMap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmap, + kMultimap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmultimap, + kSet R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLset, + kMultiset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmultiset, + kUnorderedSet R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedset, + kUnorderedMultiset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmultiset, + kUnorderedMap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmap, + kUnorderedMultimap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmultimap, + kBitset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLbitset }; /// Kinds of members to include in lists. diff --git a/core/meta/inc/TStreamerElement.h b/core/meta/inc/TStreamerElement.h index 840ab8842b279..2ec647963f318 100644 --- a/core/meta/inc/TStreamerElement.h +++ b/core/meta/inc/TStreamerElement.h @@ -49,22 +49,22 @@ class TStreamerElement : public TNamed { public: - enum ESTLtype { - kSTL = ROOT::kSTLany, - kSTLstring = ROOT::kSTLstring, - kSTLvector = ROOT::kSTLvector, - kSTLlist = ROOT::kSTLlist, - kSTLforwardlist = ROOT::kSTLforwardlist, - kSTLdeque = ROOT::kSTLdeque, - kSTLmap = ROOT::kSTLmap, - kSTLmultimap = ROOT::kSTLmultimap, - kSTLset = ROOT::kSTLset, - kSTLmultiset = ROOT::kSTLmultiset, - kSTLunorderedset = ROOT::kSTLunorderedset, - kSTLunorderedmultiset = ROOT::kSTLunorderedmultiset, - kSTLunorderedmap = ROOT::kSTLunorderedmap, - kSTLunorderedmultimap = ROOT::kSTLunorderedmultimap, - kSTLbitset = ROOT::kSTLbitset + enum R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") ESTLtype { + kSTL R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLany, + kSTLstring R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLstring, + kSTLvector R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLvector, + kSTLlist R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLlist, + kSTLforwardlist R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLforwardlist, + kSTLdeque R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLdeque, + kSTLmap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmap, + kSTLmultimap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmultimap, + kSTLset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLset, + kSTLmultiset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLmultiset, + kSTLunorderedset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedset, + kSTLunorderedmultiset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmultiset, + kSTLunorderedmap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmap, + kSTLunorderedmultimap R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLunorderedmultimap, + kSTLbitset R__DEPRECATED(6, 44, "Please use ROOT::ESTLType instead.") = ROOT::kSTLbitset }; // TStreamerElement status bits enum EStatusBits { From 5634d61250b157ab38914718a44a64aa27614888 Mon Sep 17 00:00:00 2001 From: Enrico Guiraud Date: Wed, 17 Feb 2021 17:04:19 +0100 Subject: [PATCH 2/3] [json] Prefer ROOT::ESTLType to TClassEdit::k* The latter enumerators are now deprecated. --- io/io/src/TBufferJSON.cxx | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/io/io/src/TBufferJSON.cxx b/io/io/src/TBufferJSON.cxx index 33f2550360063..b9f5c3299018f 100644 --- a/io/io/src/TBufferJSON.cxx +++ b/io/io/src/TBufferJSON.cxx @@ -110,6 +110,7 @@ class Container { #include "Compression.h" +#include "ESTLType.h" #include "TArrayI.h" #include "TError.h" #include "TBase64.h" @@ -1278,19 +1279,19 @@ void TBufferJSON::JsonStartElement(const TStreamerElement *elem, const TClass *b elem_name = "fLineStyles"; } break; - case TClassEdit::kVector: elem_name = "fVector"; break; - case TClassEdit::kList: elem_name = "fList"; break; - case TClassEdit::kForwardlist: elem_name = "fForwardlist"; break; - case TClassEdit::kDeque: elem_name = "fDeque"; break; - case TClassEdit::kMap: elem_name = "fMap"; break; - case TClassEdit::kMultiMap: elem_name = "fMultiMap"; break; - case TClassEdit::kSet: elem_name = "fSet"; break; - case TClassEdit::kMultiSet: elem_name = "fMultiSet"; break; - case TClassEdit::kUnorderedSet: elem_name = "fUnorderedSet"; break; - case TClassEdit::kUnorderedMultiSet: elem_name = "fUnorderedMultiSet"; break; - case TClassEdit::kUnorderedMap: elem_name = "fUnorderedMap"; break; - case TClassEdit::kUnorderedMultiMap: elem_name = "fUnorderedMultiMap"; break; - case TClassEdit::kBitSet: elem_name = "fBitSet"; break; + case ROOT::ESTLType::kSTLvector: elem_name = "fVector"; break; + case ROOT::ESTLType::kSTLlist: elem_name = "fList"; break; + case ROOT::ESTLType::kSTLforwardlist: elem_name = "fForwardlist"; break; + case ROOT::ESTLType::kSTLdeque: elem_name = "fDeque"; break; + case ROOT::ESTLType::kSTLmap: elem_name = "fMap"; break; + case ROOT::ESTLType::kSTLmultimap: elem_name = "fMultiMap"; break; + case ROOT::ESTLType::kSTLset: elem_name = "fSet"; break; + case ROOT::ESTLType::kSTLmultiset: elem_name = "fMultiSet"; break; + case ROOT::ESTLType::kSTLunorderedset: elem_name = "fUnorderedSet"; break; + case ROOT::ESTLType::kSTLunorderedmultiset: elem_name = "fUnorderedMultiSet"; break; + case ROOT::ESTLType::kSTLunorderedmap: elem_name = "fUnorderedMap"; break; + case ROOT::ESTLType::kSTLunorderedmultimap: elem_name = "fUnorderedMultiMap"; break; + case ROOT::ESTLType::kSTLbitset: elem_name = "fBitSet"; break; case json_TArray: elem_name = "fArray"; break; case json_TString: case json_stdstring: elem_name = "fString"; break; @@ -1400,8 +1401,9 @@ void TBufferJSON::JsonWriteObject(const void *obj, const TClass *cl, Bool_t chec } else if ((special_kind <= 0) || (special_kind > json_TArray)) { // FIXME: later post processing should be active for all special classes, while they all keep output in the value JsonDisablePostprocessing(); - } else if ((special_kind == TClassEdit::kMap) || (special_kind == TClassEdit::kMultiMap) || - (special_kind == TClassEdit::kUnorderedMap) || (special_kind == TClassEdit::kUnorderedMultiMap)) { + } else if ((special_kind == ROOT::ESTLType::kSTLmap) || (special_kind == ROOT::ESTLType::kSTLmultimap) || + (special_kind == ROOT::ESTLType::kSTLunorderedmap) || + (special_kind == ROOT::ESTLType::kSTLunorderedmultimap)) { if ((fMapAsObject && (fStack.size()==1)) || (stack && stack->fElem && strstr(stack->fElem->GetTitle(), "JSON_object"))) map_convert = 2; // mapped into normal object @@ -1455,7 +1457,8 @@ void TBufferJSON::JsonWriteObject(const void *obj, const TClass *cl, Bool_t chec } else { - bool base64 = ((special_kind == TClassEdit::kVector) && stack && stack->fElem && strstr(stack->fElem->GetTitle(), "JSON_base64")); + bool base64 = ((special_kind == ROOT::ESTLType::kSTLvector) && stack && stack->fElem && + strstr(stack->fElem->GetTitle(), "JSON_base64")); // for array, string and STL collections different handling - // they not recognized at the end as objects in JSON @@ -1915,8 +1918,8 @@ void *TBufferJSON::JsonReadObject(void *obj, const TClass *objClass, TClass **re } Int_t map_convert = 0; - if ((special_kind == TClassEdit::kMap) || (special_kind == TClassEdit::kMultiMap) || - (special_kind == TClassEdit::kUnorderedMap) || (special_kind == TClassEdit::kUnorderedMultiMap)) { + if ((special_kind == ROOT::ESTLType::kSTLmap) || (special_kind == ROOT::ESTLType::kSTLmultimap) || + (special_kind == ROOT::ESTLType::kSTLunorderedmap) || (special_kind == ROOT::ESTLType::kSTLunorderedmultimap)) { map_convert = json->is_object() ? 2 : 1; // check if map was written as array or as object if (objClass && !objClass->HasDictionary()) { From 266f34e1da1a452bc8b91f6347fe602854028bc9 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Wed, 17 Jun 2026 09:08:15 +0200 Subject: [PATCH 3/3] [cppyy] Don't leak deprecation warnings when resolving enum types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cppyy::ResolveEnum() determines an enum's underlying integer type by JIT-compiling a probe expression of the form: ```c++ std::is_same::type>::value; ``` If the enum being resolved (or its enclosing scope) is marked deprecated, this purely internal introspection emits a `-Wdeprecated-declarations` warning to stderr. Since cppyy resolves enums while wrapping classes, the warning surfaces in ordinary PyROOT sessions that merely touch a class carrying such an enum. This started breaking a range of roottest tests (which diff process output against reference files) after the historical ESTLType/ESTLtype enum copies in TClassEdit, TDictionary and TStreamerElement were deprecated. Wrap the probe expression in clang diagnostic push/ignored/pop pragmas so that resolving a deprecated enum stays silent. 🤖 Done by AI. --- .../cppyy-backend/clingwrapper/src/clingwrapper.cxx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bindings/pyroot/cppyy/cppyy-backend/clingwrapper/src/clingwrapper.cxx b/bindings/pyroot/cppyy/cppyy-backend/clingwrapper/src/clingwrapper.cxx index 26086a1a32b09..86954bba721cd 100644 --- a/bindings/pyroot/cppyy/cppyy-backend/clingwrapper/src/clingwrapper.cxx +++ b/bindings/pyroot/cppyy/cppyy-backend/clingwrapper/src/clingwrapper.cxx @@ -622,11 +622,17 @@ std::string Cppyy::ResolveEnum(const std::string& enum_type) std::ostringstream decl; // TODO: now presumed fixed with https://sft.its.cern.ch/jira/browse/ROOT-6988 for (auto& itype : {"unsigned int"}) { - decl << "std::is_same<" + // This is pure type introspection: silence any deprecation warning that + // would otherwise be emitted just because the enum being resolved (or its + // scope) happens to be marked deprecated. + decl << "_Pragma(\"clang diagnostic push\")" + "_Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")" + << "std::is_same<" << itype << ", std::underlying_type<" << et_short - << ">::type>::value;"; + << ">::type>::value;" + "_Pragma(\"clang diagnostic pop\")"; if (gInterpreter->ProcessLine(decl.str().c_str())) { // TODO: "re-sugaring" like this is brittle, but the top // should be re-translated into AST-based code anyway