protocolbuffers/protobuf

Signed / unsigned comparison warning on MSVC

Open

#15,028 opened on Dec 11, 2023

View on GitHub
 (1 comment) (0 reactions) (0 assignees)C++ (16,128 forks)batch import
c++help wanted

Repository metrics

Stars
 (71,223 stars)
PR merge metrics
 (Avg merge 2d 11h) (185 merged PRs in 30d)

Description

What version of protobuf and what language are you using? Version: v25.1 (actually a bit after, main from 20231123. Relevant code hasn't changed since then) Language: C++

What operating system (Linux, Windows, ...) and version? Windows 11 Pro 22H2

What runtime / compiler are you using (e.g., python version or gcc version) MS Visual Studio 17.8.0 (tool version 14.37.32822)

What did you do? Compile something that makes use of include/google/protobuf/map.h

What did you expect to see Warning-free compilation

What did you see instead? Warnings from Abseil : include\absl\log\internal\check_op.h(340,1): warning C4018: '>=': signed/unsigned mismatch This is from an Abseil macro that generates Check_GEImpl(), used in map.h

Anything else we should know about your project / environment

map.h line 1041 (in current main) invokes

ABSL_DCHECK_GE(new_num_buckets, kMinTableSize);

the first arg is map_index_t which resolves to uint32_t, whereas the second is defined at line 528 as

enum { kMinTableSize = 16 / sizeof(void*) };

I'm guess MSVC is choosing a signed type for the enum which is causing the problem. Changing it to

enum : unsigned int { kMinTableSize = 16 / sizeof(void*) };

makes the warnings go away

Contributor guide