From c1f11f53cb1e6285ddcb8bad249f303fb7ece7e9 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Thu, 5 Nov 2026 22:53:13 +0100 Subject: [PATCH] [ntuple] fix recreation of streamer field with type alias (cherry picked from commit 38e71de3c92e60fa81e0248fe8ff995db5af8eff) --- tree/ntuple/src/RNTupleDescriptor.cxx | 3 ++- tree/ntuple/test/StreamerField.hxx | 10 ++++++++++ tree/ntuple/test/StreamerFieldLinkDef.h | 3 +++ tree/ntuple/test/rfield_streamer.cxx | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/tree/ntuple/src/RNTupleDescriptor.cxx b/tree/ntuple/src/RNTupleDescriptor.cxx index 7f12307c94790..30aeff66362c5 100644 --- a/tree/ntuple/src/RNTupleDescriptor.cxx +++ b/tree/ntuple/src/RNTupleDescriptor.cxx @@ -69,7 +69,8 @@ std::unique_ptr ROOT::RFieldDescriptor::CreateField(const RNTupleDescriptor &ntplDesc, const ROOT::RCreateFieldOptions &options) const { if (GetStructure() == ROOT::ENTupleStructure::kStreamer) { - auto streamerField = std::make_unique(GetFieldName(), GetTypeName()); + const auto &typeName = GetTypeAlias().empty() ? GetTypeName() : GetTypeAlias(); + auto streamerField = std::make_unique(GetFieldName(), typeName); streamerField->SetOnDiskId(fFieldId); return streamerField; } diff --git a/tree/ntuple/test/StreamerField.hxx b/tree/ntuple/test/StreamerField.hxx index 8ff32e52f9dd1..3b5f7d15c80e3 100644 --- a/tree/ntuple/test/StreamerField.hxx +++ b/tree/ntuple/test/StreamerField.hxx @@ -96,4 +96,14 @@ struct TemperatureKelvin { float fValue; }; +template +struct MEtoEDMStreamer { + T fMember; +}; + +template +struct MEtoEDMClass { + T fMember; +}; + #endif // ROOT_RNTuple_Test_StreamerField diff --git a/tree/ntuple/test/StreamerFieldLinkDef.h b/tree/ntuple/test/StreamerFieldLinkDef.h index 707d59654ba20..e8449954ff170 100644 --- a/tree/ntuple/test/StreamerFieldLinkDef.h +++ b/tree/ntuple/test/StreamerFieldLinkDef.h @@ -26,4 +26,7 @@ #pragma link C++ options = rntupleStreamerMode(true) class TemperatureCelsius + ; #pragma link C++ options = rntupleStreamerMode(true) class TemperatureKelvin + ; +#pragma link C++ options = rntupleStreamerMode(true) class MEtoEDMStreamer+; +#pragma link C++ class MEtoEDMClass+; + #endif diff --git a/tree/ntuple/test/rfield_streamer.cxx b/tree/ntuple/test/rfield_streamer.cxx index 6f35f3f6ba8a4..ad57ed4bd211e 100644 --- a/tree/ntuple/test/rfield_streamer.cxx +++ b/tree/ntuple/test/rfield_streamer.cxx @@ -377,3 +377,21 @@ TEST(RField, StreamerClassMismatch) false /* matchFullMessage */); reader->LoadEntry(0); } + +TEST(RField, StreamerLong64TemplateArg) +{ + FileRaii fileGuard("test_ntuple_rfield_streamer_long64_template_arg.root"); + { + auto model = RNTupleModel::Create(); + model->AddField(RFieldBase::Create("s", "MEtoEDMStreamer").Unwrap()); + model->AddField(RFieldBase::Create("c", "MEtoEDMClass").Unwrap()); + auto writer = RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath()); + writer->Fill(); + } + + auto reader = RNTupleReader::Open("ntpl", fileGuard.GetPath()); + const auto &s = dynamic_cast(reader->GetModel().GetConstField("s")); + EXPECT_STREQ("MEtoEDMStreamer", s.GetClass()->GetName()); + const auto &c = dynamic_cast(reader->GetModel().GetConstField("c")); + EXPECT_STREQ("MEtoEDMClass", c.GetClass()->GetName()); +}