Snap for 5434517 from 10b0fd4a65a5cb1688336e6d988d20229102c88f to qt-release

Change-Id: Icf7f1a3252c55f02d3e313ee704773f1def1257a
diff --git a/src/google/protobuf/io/coded_stream.h b/src/google/protobuf/io/coded_stream.h
index c81a33a..7b742a1 100644
--- a/src/google/protobuf/io/coded_stream.h
+++ b/src/google/protobuf/io/coded_stream.h
@@ -985,7 +985,11 @@
   }
   // Slow path
   last_tag_ = ReadTagFallback(first_byte_or_zero);
-  return std::make_pair(last_tag_, static_cast<uint32>(last_tag_ - 1) < cutoff);
+  // If last_tag_ == 0 we want to return { 0, false } so the following overflow is intended.
+  // We use __builtin_add_overflow to appease the sub-overflow UB sanitizer.
+  uint32_t last_tag_minus_one;
+  __builtin_add_overflow(last_tag_, -1, &last_tag_minus_one);
+  return std::make_pair(last_tag_, last_tag_minus_one < cutoff);
 }
 
 inline bool CodedInputStream::LastTagWas(uint32 expected) {