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()); +}