From 5d002146857b04af9e5343c902e8ac8b50df89f8 Mon Sep 17 00:00:00 2001 From: scott snyder <snyder@bnl.gov> Date: Fri, 5 Jun 2020 22:53:11 +0200 Subject: [PATCH] Identifier: Preserve invalid 32-bit values. When we initialize an Identifier from a 32-bit value, make sure to preserve invalid values. We were just shifting left by 32 bits, which means that the invalid 0xffffffff becomes 0xffffffff00000000, for which is_valid() returns true. This was causing us not to detect some invalid identifiers after they were saved and reloaded. --- .../Identifier/Identifier/Identifier.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/DetectorDescription/Identifier/Identifier/Identifier.h b/DetectorDescription/Identifier/Identifier/Identifier.h index f2dbfcbdfc0..502385156f6 100644 --- a/DetectorDescription/Identifier/Identifier/Identifier.h +++ b/DetectorDescription/Identifier/Identifier/Identifier.h @@ -245,7 +245,12 @@ inline Identifier::Identifier (Identifier32::value_type value) : m_id(max_value) { //std::cout << "Identifier(Identifier32::value_type) " << value << std::endl; - m_id = (static_cast<value_type>(value) << 32); + if (value == ~static_cast<Identifier32::value_type>(0)) { + m_id = max_value; + } + else { + m_id = (static_cast<value_type>(value) << 32); + } } inline Identifier::Identifier (int value) : m_id(max_value) @@ -318,7 +323,12 @@ inline Identifier& Identifier::operator = (Identifier32::value_type value) { //std::cout << "operator=(Identifier32::value_type) " << value << std::endl; - m_id = static_cast<value_type>(value) << 32; + if (value == ~static_cast<Identifier32::value_type>(0)) { + m_id = max_value; + } + else { + m_id = static_cast<value_type>(value) << 32; + } return (*this); } inline Identifier& -- GitLab