Conversation
…ad of change to int16 (maybe)
MSVC #define private public incompatibility (tests/db/index/CMakeLists.txt): Excluded 4 tests on MSVC (mmap_store_test, mem_store_test, inverted_indexer_util_test, segment_test) because MSVC encodes access specifiers in mangled names, making the #define private public hack fundamentally incompatible.
CMakeLists.txt
Outdated
| add_compile_options(/wd4245 /wd4334 /wd4702 /wd4305) | ||
|
|
||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror=return-type") | ||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror=return-type") | ||
| # //warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) | ||
| # keeps |= (1 << k); | ||
| add_compile_options(/wd4334) | ||
| ###### | ||
|
|
There was a problem hiding this comment.
/wd4334 suppressed twice
Warning C4334 ("result of 32-bit shift implicitly converted to 64 bits") is already listed in the combined add_compile_options(/wd4245 /wd4334 /wd4702 /wd4305) line above, and then suppressed a second time individually. The duplicate is harmless but indicates a copy-paste oversight.
| add_compile_options(/wd4245 /wd4334 /wd4702 /wd4305) | |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror=return-type") | |
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror=return-type") | |
| # //warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) | |
| # keeps |= (1 << k); | |
| add_compile_options(/wd4334) | |
| ###### | |
| add_compile_options(/wd4245 /wd4702 /wd4305) | |
| # warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) | |
| # keeps |= (1 << k); | |
| add_compile_options(/wd4334) |
| add_compile_options(/wd4146) # unary minus operator applied to unsigned type #usage: uint32_t seg_id_{-1U}; | ||
| add_compile_options(/wd4310) # warning C4310: cast truncates constant value |
There was a problem hiding this comment.
Broad narrowing-conversion warnings suppressed without fix
/wd4267 (conversion from size_t to a smaller type) and /wd4244 (general type narrowing) are silently disabled with a comment acknowledging they need to be resolved. These two warnings regularly surface real runtime bugs (e.g., size_t → int truncation on 64-bit data, unintended float→int narrowing). Leaving them suppressed while the PR is merged makes it easy for future changes to introduce silent truncation bugs that are never caught.
Consider replacing the blanket suppression with targeted #pragma warning(suppress: ...) at the specific call sites that are genuinely safe, rather than disabling them project-wide.
| namespace core { | ||
|
|
There was a problem hiding this comment.
key_t type alias defined in two headers
using key_t = uint64_t is introduced here inside namespace zvec::core, and an identical alias is also added to src/core/utility/sparse_utility.h (line 27) in the same namespace. Any translation unit that includes both headers will have a duplicate declaration. While C++ allows re-declaring a type alias to the same type, this duplication is fragile — a future change to one without the other creates a subtle mismatch. The alias should live in a single shared header (e.g. a types.h in src/core) and be included by both files.
… 0xFFFFFFFFFFFFFFFF.
…m a non-owning thread, which is undefined behavior caught by MSVC's debug assertions
…r, may use other way
gtest-all.obj : warning LNK4197: export '??_7TestSuite@testing@@6b@' specified multiple times; using first specification [C:\Users\Administrator\Desktop\workspace\zvec\build_vs2022\thirdparty\googletest\googletest-1.10.0\googletest\gtest.vcxproj] gtest-all.obj : warning LNK4197: export '??_7AssertionException@testing@@6b@' specified multiple times; using first specification [C:\Users\Administrator\Desktop\workspace\zvec\build_vs2022\thirdparty\googletest\googletest-1.10.0\googletest\gtest.vcxproj] gtest-all.obj : warning LNK4197: export '??_7UnitTest@testing@@6b@' specified multiple times; using first specification [C:\Users\Administrator\Desktop\workspace\zvec\build_vs2022\thirdparty\googletest\googletest-1.10.0\googletest\gtest.vcxproj] gtest-all.obj : warning LNK4197: export '??_7ScopedFakeTestPartResultReporter@testing@@6b@' specified multiple times; using first specification [C:\Users\Administrator\Desktop\workspace\zvec\build_vs2022\thirdparty\googletest\googletest-1.10.0\googletest\gtest.vcxproj] gtest-all.obj : warning LNK4197: export '??_7UnitTestImpl@
ffc9d32 to
5c61212
Compare
# Conflicts: # cmake/bazel.cmake # src/ailego/math/inner_product_matrix_fp16.cc # src/ailego/math/inner_product_matrix_fp32.cc # src/ailego/math/mips_euclidean_distance_matrix_fp32.cc
Greptile Summary
This WIP PR adds initial Windows (MSVC) support across the zvec codebase, touching 76 files spanning the build system, platform-abstraction headers, core algorithm implementations, storage helpers, and tests.
Key changes include:
CMakeLists.txtselects C++20 (required for designated-initializer support in MSVC), adds the necessary/FS,/EHsc, and/Zc:preprocessorflags, and re-routes all third-party builds (lz4, Arrow, RocksDB, glog, sparsehash) to their Windows-compatible build paths.__builtin_bswap*→_byteswap_*,posix_memalign→ailego_aligned_malloc, zero-length arrays[0]→ C99 flexible array members[],__attribute__((format(printf,...)))→ the newAILEGO_PRINTF_FORMATmacro, and POSIX headers guarded with#ifndef _MSC_VER.CONFIGURE_COMMANDaccidentally dropsenv ${CONFIGURE_ENV_LIST}, breakingUSE_OSS_MIRRORmirror configuration for Arrow builds on all non-Android platforms./wd4267and/wd4244(narrowing conversions) are globally disabled with aTODOcomment acknowledging they need to be resolved; these warnings catch real truncation bugs and should be addressed at the source rather than silenced.using key_t = uint64_tis introduced in bothivf_index_format.handsparse_utility.hwithinnamespace zvec::core; it should live in a single shared header./wd4334is listed twice inCMakeLists.txt(once in a combined line, once standalone).Confidence Score: 3/5
env ${CONFIGURE_ENV_LIST}from Arrow's configure command is a real regression for USE_OSS_MIRROR builds, the project-wide suppression of C4267/C4244 masks potentially real type-truncation issues with only a TODO comment, and the PR is explicitly marked [WIP]. The overall approach and direction are sound, but these issues should be resolved before merging.thirdparty/arrow/CMakeLists.txt(OSS mirror regression) andCMakeLists.txt(broad warning suppression) need the most attention.Important Files Changed
env ${CONFIGURE_ENV_LIST}prefix from the non-Android CONFIGURE_COMMAND, breaking USE_OSS_MIRROR for Arrow builds.neighbors[0]to standard C99/C++ flexible array memberneighbors[]for MSVC portability.typedef unsigned int id_tunder _MSC_VER to provide the POSIX id_t type that is unavailable on Windows.#define private publichack and provides a truncate() shim via _chsize; the keyword-redefine approach is non-standard but necessary for this test pattern on MSVC.Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[CMake Configure] --> B{MSVC?} B -->|Yes| C[C++20 Standard\n/FS /EHsc /Zc:preprocessor\n/we4716 + suppress C4267 C4244 etc.] B -->|No| D[C++17 Standard\n-Wall -Werror=return-type] C --> E[Third-party builds] D --> E E --> F{lz4} F -->|MSVC| F1[CMake subdir build\nlz4.lib] F -->|Linux/Mac| F2[Makefile build\nliblz4.a] E --> G{Arrow} G -->|MSVC| G1[parquet_static.lib\narrow_static.lib etc.\n+ /FS compile flag] G -->|Linux/Mac| G2[libparquet.a\nlibarrow.a etc.] G1 --> G3[⚠️ env CONFIGURE_ENV_LIST\ndropped — USE_OSS_MIRROR broken] E --> H[RocksDB\n+ lz4::lz4 imported target\n+ ROCKSDB_SKIP_THIRDPARTY] E --> I[glog\nHAVE_SNPRINTF on MSVC] E --> J[sparsehash\n.windows.patch → static_assert] C --> K[Platform abstractions] K --> K1[ssize_t typedef moved\nbefore extern C] K --> K2[_mm_prefetch cast to const char*] K --> K3[S_ISDIR macro for MSVC] K --> K4[ailego_aligned_malloc\nreplaces posix_memalign] K --> K5[__builtin_bswap* →\n_byteswap_* on MSVC] K --> K6[Zero-length arrays 0\n→ flexible arrays]Comments Outside Diff (1)
thirdparty/arrow/CMakeLists.txt, line 63-82 (link)OSS mirror env vars dropped from Arrow configure command
The
env ${CONFIGURE_ENV_LIST}prefix was removed from the non-AndroidCONFIGURE_COMMAND. This means any mirror proxy settings set byUSE_OSS_MIRROR(e.g., custom download URLs passed as env vars) will no longer be forwarded to Arrow's CMake configure step on non-Android platforms — a regression for any build that relies onUSE_OSS_MIRROR.If
CONFIGURE_ENV_LISTis only needed for the mirror case, you can preserve it with a conditional:Last reviewed commit: de9724b