Skip to content

Commit

Permalink
Workaround ICE on gcc 7.5 by not having one overload call the other o…
Browse files Browse the repository at this point in the history
…ne with a

const_cast.

Fixes #13715

PiperOrigin-RevId: 561444098
  • Loading branch information
protobuf-github-bot authored and copybara-github committed Aug 30, 2023
1 parent 403a32d commit 648a86f
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion src/google/protobuf/generated_message_tctable_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,8 @@ class PROTOBUF_EXPORT TcParser final {
static const char* FastMlS1(PROTOBUF_TC_PARAM_DECL);
static const char* FastMlS2(PROTOBUF_TC_PARAM_DECL);

// NOTE: Do not dedup RefAt by having one call the other with a const_cast. It
// causes ICEs of gcc 7.5.
template <typename T>
static inline T& RefAt(void* x, size_t offset) {
T* target = reinterpret_cast<T*>(static_cast<char*>(x) + offset);
Expand All @@ -599,7 +601,20 @@ class PROTOBUF_EXPORT TcParser final {

template <typename T>
static inline const T& RefAt(const void* x, size_t offset) {
return RefAt<T>(const_cast<void*>(x), offset);
const T* target =
reinterpret_cast<const T*>(static_cast<const char*>(x) + offset);
#if !defined(NDEBUG) && !(defined(_MSC_VER) && defined(_M_IX86))
// Check the alignment in debug mode, except in 32-bit msvc because it does
// not respect the alignment as expressed by `alignof(T)`
if (PROTOBUF_PREDICT_FALSE(
reinterpret_cast<uintptr_t>(target) % alignof(T) != 0)) {
AlignFail(std::integral_constant<size_t, alignof(T)>(),
reinterpret_cast<uintptr_t>(target));
// Explicit abort to let compilers know this code-path does not return
abort();
}
#endif
return *target;
}

template <typename T, bool is_split>
Expand Down

0 comments on commit 648a86f

Please sign in to comment.