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