This is an automated email from the ASF dual-hosted git repository.

cyx-6 pushed a commit to branch codex/cxx20-baseline
in repository https://gitbox.apache.org/repos/asf/tvm-ffi.git

commit cf6ffdbc272983f960f8f2aa2120a9e2e896cf6c
Author: Yaxing Cai <[email protected]>
AuthorDate: Thu Nov 5 00:37:38 2026 +0800

    [BUILD] Require C++20 for TVM FFI
---
 .agents/skills/devtools/SKILL.md                   |  2 +-
 .clang-tidy                                        |  3 ++
 AGENTS.md                                          |  4 +--
 CMakeLists.txt                                     |  8 ++---
 addons/tvm_ffi_orcjit/CMakeLists.txt               |  2 +-
 addons/tvm_ffi_orcjit/README.md                    |  4 +--
 .../examples/quick-start/CMakeLists.txt            |  2 +-
 addons/tvm_ffi_orcjit/tests/CMakeLists.txt         |  2 +-
 cmake/tvm_ffi-config.cmake                         |  4 +--
 docs/conf.py                                       |  2 +-
 docs/dev/source_build.rst                          |  4 +--
 docs/get_started/quickstart.rst                    |  2 +-
 docs/guides/cubin_launcher.rst                     |  2 +-
 docs/packaging/cpp_tooling.rst                     |  2 +-
 .../embedded_cubin/include_bin2c/CMakeLists.txt    |  2 +-
 include/tvm/ffi/extra/cuda/cubin_launcher.h        |  2 +-
 include/tvm/ffi/function.h                         |  3 +-
 python/tvm_ffi/config.py                           |  2 +-
 python/tvm_ffi/cpp/extension.py                    | 34 +++++++++++-----------
 python/tvm_ffi/dataclasses/gen_abi_cpp.py          |  2 +-
 tests/cpp/CMakeLists.txt                           |  2 +-
 tests/cpp/extra/test_json_parser.cc                | 14 ++++-----
 tests/python/test_libinfo.py                       |  2 +-
 23 files changed, 55 insertions(+), 51 deletions(-)

diff --git a/.agents/skills/devtools/SKILL.md b/.agents/skills/devtools/SKILL.md
index 5d85232a..62542940 100644
--- a/.agents/skills/devtools/SKILL.md
+++ b/.agents/skills/devtools/SKILL.md
@@ -11,7 +11,7 @@ Condensed reference from `docs/dev/`. Use this when working 
on the TVM-FFI codeb
 ## Prerequisites
 
 - **Python**: 3.9+ (managed via `uv`; default virtualenv at `.venv`)
-- **Compiler**: C++17-capable toolchain (GCC/Clang on Linux, Apple Clang on 
macOS, MSVC on Windows)
+- **Compiler**: C++20-capable toolchain (GCC/Clang on Linux, Apple Clang on 
macOS, MSVC on Windows)
 - **Build tools**: CMake 3.26+, Ninja
 - **Source**: Always clone with `--recursive`, or run `git submodule update 
--init --recursive`
 
diff --git a/.clang-tidy b/.clang-tidy
index 3842dc7a..bebf3af0 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -1,4 +1,5 @@
 # -clang-analyzer-unix.Malloc is disabled due to false positives
+# C++20 constraints and integer comparison rewrites remain optional.
 Checks: >
   clang-diagnostic-*,
   clang-analyzer-*,
@@ -11,6 +12,8 @@ Checks: >
   -modernize-concat-nested-namespaces,
   -modernize-use-auto,
   -modernize-use-nodiscard,
+  -modernize-use-constraints,
+  -modernize-use-integer-sign-comparison,
   -modernize-return-braced-init-list,
   -modernize-avoid-c-arrays,
   -bugprone-easily-swappable-parameters,
diff --git a/AGENTS.md b/AGENTS.md
index 5b2e143f..354f33c2 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -20,7 +20,7 @@
 ## What is this project?
 
 TVM FFI is an open ABI and FFI (Foreign Function Interface) for machine 
learning
-systems. It provides a stable C ABI, C++17 API, Python bindings (via Cython),
+systems. It provides a stable C ABI, C++20 API, Python bindings (via Cython),
 and Rust bindings. The core abstractions are type-erased values 
(`Any`/`AnyView`),
 reference-counted objects (`Object`/`ObjectRef`), and packed functions 
(`Function`).
 
@@ -75,7 +75,7 @@ cmake --build build_cpp --parallel --config RelWithDebInfo 
--target tvm_ffi_shar
 
 ### Prerequisites
 
-- Python 3.9+, C++17 compiler, CMake 3.26+, Ninja
+- Python 3.9+, C++20 compiler, CMake 3.26+, Ninja
 - Submodules: `git submodule update --init --recursive`
 
 ## Testing
diff --git a/CMakeLists.txt b/CMakeLists.txt
index becf6201..81ef72bb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,7 +39,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/cmake/Utils/Library.cmake)
 # linking
 add_library(tvm_ffi_header INTERFACE)
 add_library(tvm_ffi::header ALIAS tvm_ffi_header)
-target_compile_features(tvm_ffi_header INTERFACE cxx_std_17)
+target_compile_features(tvm_ffi_header INTERFACE cxx_std_20)
 
 if (CMAKE_CXX_BYTE_ORDER STREQUAL "BIG_ENDIAN")
   target_compile_definitions(tvm_ffi_header INTERFACE 
TVM_FFI_CMAKE_LITTLE_ENDIAN=0)
@@ -96,7 +96,7 @@ if (TVM_FFI_USE_EXTRA_CXX_API)
 endif ()
 
 add_library(tvm_ffi_objs OBJECT ${_tvm_ffi_objs_sources})
-target_compile_features(tvm_ffi_objs PRIVATE cxx_std_17)
+target_compile_features(tvm_ffi_objs PRIVATE cxx_std_20)
 
 set_target_properties(
   tvm_ffi_objs
@@ -171,7 +171,7 @@ tvm_ffi_hide_static_linked_lib_symbols(tvm_ffi_shared)
 # only for testing purposes
 target_sources(tvm_ffi_testing PRIVATE 
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/testing/testing.cc")
 target_compile_definitions(tvm_ffi_testing PRIVATE 
TVM_FFI_DLL_EXPORT_INCLUDE_METADATA=1)
-target_compile_features(tvm_ffi_testing PRIVATE cxx_std_17)
+target_compile_features(tvm_ffi_testing PRIVATE cxx_std_20)
 set_target_properties(
   tvm_ffi_testing
   PROPERTIES CXX_EXTENSIONS OFF
@@ -315,7 +315,7 @@ if (TVM_FFI_BUILD_PYTHON_MODULE)
   target_include_directories(
     tvm_ffi_cython PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/python/tvm_ffi/cython
   )
-  target_compile_features(tvm_ffi_cython PRIVATE cxx_std_17)
+  target_compile_features(tvm_ffi_cython PRIVATE cxx_std_20)
   target_link_libraries(tvm_ffi_cython PRIVATE tvm_ffi_header)
   target_link_libraries(tvm_ffi_cython PRIVATE tvm_ffi_shared)
   # link against testing to ensure right unloading order (cython first then 
testing)
diff --git a/addons/tvm_ffi_orcjit/CMakeLists.txt 
b/addons/tvm_ffi_orcjit/CMakeLists.txt
index a8c04472..a81dda59 100644
--- a/addons/tvm_ffi_orcjit/CMakeLists.txt
+++ b/addons/tvm_ffi_orcjit/CMakeLists.txt
@@ -5,7 +5,7 @@ project(
   LANGUAGES C CXX
 )
 
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 20)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
diff --git a/addons/tvm_ffi_orcjit/README.md b/addons/tvm_ffi_orcjit/README.md
index 618803e8..6c0b3c98 100644
--- a/addons/tvm_ffi_orcjit/README.md
+++ b/addons/tvm_ffi_orcjit/README.md
@@ -69,7 +69,7 @@ pip install apache-tvm-ffi apache-tvm_ffi_orcjit
 
 #### Prerequisites
 
-- Python 3.10+, CMake 3.24+, C++17 compiler
+- Python 3.10+, CMake 3.24+, C++20 compiler
 
 The build automatically installs 
[mlc-llvm-static](https://pypi.org/project/mlc-llvm-static/)
 from PyPI. It supplies LLVM 23.1.1, static zlib/zstd, and the Linux ORC 
runtime.
@@ -172,7 +172,7 @@ TVM_FFI_DLL_EXPORT_TYPED_FUNC(add, [](int a, int b) {
 });
 ```
 
-Compile: `clang++ -std=c++17 -fPIC -O2 -c -o example.o example.cc`
+Compile: `clang++ -std=c++20 -fPIC -O2 -c -o example.o example.cc`
 
 ### Pure C (all platforms including Windows)
 
diff --git a/addons/tvm_ffi_orcjit/examples/quick-start/CMakeLists.txt 
b/addons/tvm_ffi_orcjit/examples/quick-start/CMakeLists.txt
index 458f7fdd..969771f3 100644
--- a/addons/tvm_ffi_orcjit/examples/quick-start/CMakeLists.txt
+++ b/addons/tvm_ffi_orcjit/examples/quick-start/CMakeLists.txt
@@ -18,7 +18,7 @@
 cmake_minimum_required(VERSION 3.18)
 project(tvm_ffi_orcjit_example)
 
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 20)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 
diff --git a/addons/tvm_ffi_orcjit/tests/CMakeLists.txt 
b/addons/tvm_ffi_orcjit/tests/CMakeLists.txt
index 95776bf4..654db648 100644
--- a/addons/tvm_ffi_orcjit/tests/CMakeLists.txt
+++ b/addons/tvm_ffi_orcjit/tests/CMakeLists.txt
@@ -18,7 +18,7 @@
 cmake_minimum_required(VERSION 3.18)
 project(tvm_ffi_orcjit_tests)
 
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 20)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 
diff --git a/cmake/tvm_ffi-config.cmake b/cmake/tvm_ffi-config.cmake
index 63333da3..3356be1c 100644
--- a/cmake/tvm_ffi-config.cmake
+++ b/cmake/tvm_ffi-config.cmake
@@ -43,12 +43,12 @@ execute_process(
 message(STATUS "Finding libfiles ${tvm_ffi_LIB_FILES}")
 
 add_library(tvm_ffi::header INTERFACE IMPORTED)
-target_compile_features(tvm_ffi::header INTERFACE cxx_std_17)
+target_compile_features(tvm_ffi::header INTERFACE cxx_std_20)
 target_include_directories(tvm_ffi::header INTERFACE "${tvm_ffi_INCLUDE_DIR}")
 target_include_directories(tvm_ffi::header INTERFACE 
"${tvm_ffi_DLPACK_INCLUDE_DIR}")
 
 add_library(tvm_ffi::shared SHARED IMPORTED)
-target_compile_features(tvm_ffi::shared INTERFACE cxx_std_17)
+target_compile_features(tvm_ffi::shared INTERFACE cxx_std_20)
 
 if (WIN32)
   set_target_properties(tvm_ffi::shared PROPERTIES IMPORTED_IMPLIB 
"${tvm_ffi_LIB_FILES}")
diff --git a/docs/conf.py b/docs/conf.py
index 2bae0541..17eb7e74 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -91,7 +91,7 @@ PREDEFINED             += TVM_FFI_DLL= TVM_FFI_DLL_EXPORT= 
TVM_FFI_INLINE= \
                           TVM_FFI_EXTRA_CXX_API= TVM_FFI_WEAK= 
TVM_FFI_DOXYGEN_MODE \
                           TVM_FFI_COLD_CODE= \
                           TVM_FFI_PREDICT_FALSE(x)=x TVM_FFI_PREDICT_TRUE(x)=x 
\
-                          __cplusplus=201703
+                          __cplusplus=202002L
 EXCLUDE_SYMBOLS        += *detail*  *TypeTraits* std \
                          *use_default_type_traits_v* *is_optional_type_v* 
*operator* \
                          tvm::ffi::reflection::default_ 
tvm::ffi::reflection::default_factory
diff --git a/docs/dev/source_build.rst b/docs/dev/source_build.rst
index 31f692b4..05bee04b 100644
--- a/docs/dev/source_build.rst
+++ b/docs/dev/source_build.rst
@@ -28,9 +28,9 @@ This guide covers two common workflows:
    :class: tip
 
    - Python: 3.9 or newer
-   - Compiler: C++17-capable toolchain
+   - Compiler: C++20-capable toolchain
 
-     - Linux: GCC or Clang with C++17 support
+     - Linux: GCC or Clang with C++20 support
      - macOS: Apple Clang (via Xcode Command Line Tools)
      - Windows: MSVC (Visual Studio 2019 or 2022, x64)
 
diff --git a/docs/get_started/quickstart.rst b/docs/get_started/quickstart.rst
index cd9adce6..a2f87e8b 100644
--- a/docs/get_started/quickstart.rst
+++ b/docs/get_started/quickstart.rst
@@ -36,7 +36,7 @@ We can build a single shared library that works across:
    :name: prerequisite
 
    - Python: 3.9 or newer
-   - Compiler: C++17-capable toolchain (GCC/Clang/MSVC)
+   - Compiler: C++20-capable toolchain (GCC/Clang/MSVC)
    - Optional ML frameworks for testing: NumPy, PyTorch, JAX, CuPy, 
PaddlePaddle
    - CUDA: Any modern version (if you want to try the CUDA part)
    - TVM-FFI installed via:
diff --git a/docs/guides/cubin_launcher.rst b/docs/guides/cubin_launcher.rst
index 386ca168..e4a5b91f 100644
--- a/docs/guides/cubin_launcher.rst
+++ b/docs/guides/cubin_launcher.rst
@@ -249,7 +249,7 @@ For more advanced use cases or non-CMake build systems, you 
can use the Python c
 .. code-block:: bash
 
    # Step 1: Compile C++ source to object file
-   g++ -c -fPIC -std=c++17 -I/path/to/tvm-ffi/include mycode.cc -o mycode.o
+   g++ -c -fPIC -std=c++20 -I/path/to/tvm-ffi/include mycode.cc -o mycode.o
 
    # Step 2: Embed CUBIN into the object file
    python -m tvm_ffi.utils.embed_cubin \
diff --git a/docs/packaging/cpp_tooling.rst b/docs/packaging/cpp_tooling.rst
index f49b5363..3c1b216a 100644
--- a/docs/packaging/cpp_tooling.rst
+++ b/docs/packaging/cpp_tooling.rst
@@ -26,7 +26,7 @@ see :doc:`../get_started/quickstart`.
 .. admonition:: Prerequisite
    :class: hint
 
-   - Compiler: C++17-capable toolchain (GCC/Clang/MSVC)
+   - Compiler: C++20-capable toolchain (GCC/Clang/MSVC)
    - CMake: 3.18 or newer
    - TVM-FFI installed via
 
diff --git 
a/examples/cubin_launcher/embedded_cubin/include_bin2c/CMakeLists.txt 
b/examples/cubin_launcher/embedded_cubin/include_bin2c/CMakeLists.txt
index f825878b..f3e919c8 100644
--- a/examples/cubin_launcher/embedded_cubin/include_bin2c/CMakeLists.txt
+++ b/examples/cubin_launcher/embedded_cubin/include_bin2c/CMakeLists.txt
@@ -18,7 +18,7 @@
 cmake_minimum_required(VERSION 3.27)
 project(embedded_cubin_example LANGUAGES CXX CUDA)
 
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 20)
 
 set(CMAKE_TVM_FFI_CUBIN_LAUNCHER_USE_DRIVER_API
     OFF
diff --git a/include/tvm/ffi/extra/cuda/cubin_launcher.h 
b/include/tvm/ffi/extra/cuda/cubin_launcher.h
index d384ce43..6082cd7d 100644
--- a/include/tvm/ffi/extra/cuda/cubin_launcher.h
+++ b/include/tvm/ffi/extra/cuda/cubin_launcher.h
@@ -88,7 +88,7 @@ namespace ffi {
  * nvcc --cubin -arch=sm_75 kernel.cu -o kernel.cubin
  *
  * # Step 2: Compile C++ source to object file
- * g++ -c -fPIC -std=c++17 -I/path/to/tvm-ffi/include mycode.cc -o mycode.o
+ * g++ -c -fPIC -std=c++20 -I/path/to/tvm-ffi/include mycode.cc -o mycode.o
  *
  * # Step 3: Embed CUBIN using Python utility
  * python -m tvm_ffi.utils.embed_cubin \
diff --git a/include/tvm/ffi/function.h b/include/tvm/ffi/function.h
index 919125d2..d4068255 100644
--- a/include/tvm/ffi/function.h
+++ b/include/tvm/ffi/function.h
@@ -136,7 +136,8 @@ class FunctionObj : public Object, public 
TVMFFIFunctionCell {
 
  protected:
   /*! \brief Make default constructor protected. */
-  FunctionObj() {}
+  // Keep value-initialization from zero-initializing the function cell.
+  FunctionObj() {}  // NOLINT(modernize-use-equals-default)
   friend class Function;
 
  private:
diff --git a/python/tvm_ffi/config.py b/python/tvm_ffi/config.py
index 15a53d3e..1d3d2f66 100644
--- a/python/tvm_ffi/config.py
+++ b/python/tvm_ffi/config.py
@@ -78,7 +78,7 @@ def __main__() -> None:  # noqa: PLR0912
     if args.cxxflags:
         include_dir = libinfo.find_include_path()
         dlpack_include_dir = libinfo.find_dlpack_include_path()
-        print(f"-I{include_dir} -I{dlpack_include_dir} -std=c++17")
+        print(f"-I{include_dir} -I{dlpack_include_dir} -std=c++20")
     if args.cflags:
         include_dir = libinfo.find_include_path()
         dlpack_include_dir = libinfo.find_dlpack_include_path()
diff --git a/python/tvm_ffi/cpp/extension.py b/python/tvm_ffi/cpp/extension.py
index f37f279e..e729b2f2 100644
--- a/python/tvm_ffi/cpp/extension.py
+++ b/python/tvm_ffi/cpp/extension.py
@@ -462,7 +462,7 @@ def _generate_ninja_build(  # noqa: PLR0915, PLR0912
     tvm_ffi_lib_name = tvm_ffi_lib.stem
     if IS_WINDOWS:
         default_cflags = ["/O2", "/MD"]
-        default_cxxflags = ["/std:c++17", "/O2", "/MD", "/EHsc"]
+        default_cxxflags = ["/std:c++20", "/O2", "/MD", "/EHsc"]
         _win_warnings = [
             "/wd4819",
             "/wd4251",
@@ -479,7 +479,7 @@ def _generate_ninja_build(  # noqa: PLR0915, PLR0912
         default_cxxflags += _win_warnings
         # nvcc forwards its own -std and -O to cl for the host pass, as it 
does to gcc.
         # /MD matches the C++ objects: cl's default /MT fails a mixed link 
(LNK2038).
-        default_cuda_cflags = ["-Xcompiler", "/MD", "-std=c++17", "-O2"]
+        default_cuda_cflags = ["-Xcompiler", "/MD", "-std=c++20", "-O2"]
         default_ldflags = [
             "/DLL",
             _windows_argument(f"/LIBPATH:{tvm_ffi_lib_path}"),
@@ -493,8 +493,8 @@ def _generate_ninja_build(  # noqa: PLR0915, PLR0912
             ]
     else:
         default_cflags = ["-fPIC", "-O2"]
-        default_cxxflags = ["-std=c++17", "-fPIC", "-O2"]
-        default_cuda_cflags = ["-std=c++17", "-O2"]
+        default_cxxflags = ["-std=c++20", "-fPIC", "-O2"]
+        default_cuda_cflags = ["-std=c++20", "-O2"]
         default_ldflags = ["-shared", f"-L{tvm_ffi_lib_path}", "-ltvm_ffi"]
 
         if with_hip:
@@ -949,8 +949,8 @@ def build_inline(  # noqa: PLR0913
         The extra compiler flags for C++ compilation.
         The default flags are:
 
-        - On Linux/macOS: ['-std=c++17', '-fPIC', '-O2']
-        - On Windows: ['/std:c++17', '/O2']
+        - On Linux/macOS: ['-std=c++20', '-fPIC', '-O2']
+        - On Windows: ['/std:c++20', '/O2']
 
     extra_cuda_cflags
         The extra compiler flags for CUDA compilation.
@@ -1179,8 +1179,8 @@ def load_inline(  # noqa: PLR0913
         The extra compiler flags for C++ compilation.
         The default flags are:
 
-        - On Linux/macOS: ['-std=c++17', '-fPIC', '-O2']
-        - On Windows: ['/std:c++17', '/O2']
+        - On Linux/macOS: ['-std=c++20', '-fPIC', '-O2']
+        - On Windows: ['/std:c++20', '/O2']
 
     extra_cuda_cflags
         The extra compiler flags for CUDA compilation.
@@ -1347,17 +1347,17 @@ def build(  # noqa: PLR0913
         Extra compiler flags applied to both C and C++ compilation.
         The C++ default flags are:
 
-        - On Linux/macOS: ['-std=c++17', '-fPIC', '-O2']
-        - On Windows: ['/std:c++17', '/MD', '/O2']
+        - On Linux/macOS: ['-std=c++20', '-fPIC', '-O2']
+        - On Windows: ['/std:c++20', '/MD', '/O2']
 
-        The C default flags omit ``-std=c++17`` and ``/EHsc``.
+        The C default flags omit ``-std=c++20`` and ``/EHsc``.
 
     extra_cuda_cflags
         The extra compiler flags for CUDA compilation.
         The default flags are:
 
-        - ['-Xcompiler', '-fPIC', '-std=c++17', '-O2'] (Linux/macOS)
-        - ['-Xcompiler', '/MD', '-std=c++17', '-O2'] (Windows)
+        - ['-Xcompiler', '-fPIC', '-std=c++20', '-O2'] (Linux/macOS)
+        - ['-Xcompiler', '/MD', '-std=c++20', '-O2'] (Windows)
 
     extra_ldflags
         The extra linker flags.
@@ -1505,15 +1505,15 @@ def load(  # noqa: PLR0913
         The extra compiler flags for C++ compilation.
         The default flags are:
 
-        - On Linux/macOS: ['-std=c++17', '-fPIC', '-O2']
-        - On Windows: ['/std:c++17', '/MD', '/O2']
+        - On Linux/macOS: ['-std=c++20', '-fPIC', '-O2']
+        - On Windows: ['/std:c++20', '/MD', '/O2']
 
     extra_cuda_cflags
         The extra compiler flags for CUDA compilation.
         The default flags are:
 
-        - ['-Xcompiler', '-fPIC', '-std=c++17', '-O2'] (Linux/macOS)
-        - ['-Xcompiler', '/MD', '-std=c++17', '-O2'] (Windows)
+        - ['-Xcompiler', '-fPIC', '-std=c++20', '-O2'] (Linux/macOS)
+        - ['-Xcompiler', '/MD', '-std=c++20', '-O2'] (Windows)
 
     extra_ldflags
         The extra linker flags.
diff --git a/python/tvm_ffi/dataclasses/gen_abi_cpp.py 
b/python/tvm_ffi/dataclasses/gen_abi_cpp.py
index 50be13a2..d5b358b9 100644
--- a/python/tvm_ffi/dataclasses/gen_abi_cpp.py
+++ b/python/tvm_ffi/dataclasses/gen_abi_cpp.py
@@ -697,7 +697,7 @@ def gen_abi_cpp(type_keys: str | Sequence[str]) -> str:
     Returns
     -------
     str
-        Deterministic C++17 header source.  The source performs lookup only;
+        Deterministic C++20 header source.  The source performs lookup only;
         it does not register, compile, load, or allocate any type.
 
     """
diff --git a/tests/cpp/CMakeLists.txt b/tests/cpp/CMakeLists.txt
index ad8c6c87..dc17c92c 100644
--- a/tests/cpp/CMakeLists.txt
+++ b/tests/cpp/CMakeLists.txt
@@ -6,7 +6,7 @@ if (TVM_FFI_USE_EXTRA_CXX_API)
 endif ()
 
 add_executable(tvm_ffi_tests ${_test_sources})
-target_compile_features(tvm_ffi_tests PRIVATE cxx_std_17)
+target_compile_features(tvm_ffi_tests PRIVATE cxx_std_20)
 
 set_target_properties(
   tvm_ffi_tests
diff --git a/tests/cpp/extra/test_json_parser.cc 
b/tests/cpp/extra/test_json_parser.cc
index 49d2c34c..6c0d90b2 100644
--- a/tests/cpp/extra/test_json_parser.cc
+++ b/tests/cpp/extra/test_json_parser.cc
@@ -144,7 +144,7 @@ TEST(JSONParser, String) {
   // test unicode code point
   EXPECT_EQ(json::Parse("\"\\u0041\"").cast<String>(), "A");
   // test unicode surrogate pair
-  EXPECT_EQ(json::Parse("\"\\uD83D\\uDE04hello\"").cast<String>(), 
u8"\U0001F604hello");
+  EXPECT_EQ(json::Parse("\"\\uD83D\\uDE04hello\"").cast<String>(), 
"\xF0\x9F\x98\x84hello");
 }
 
 TEST(JSONParser, WrongString) {
@@ -281,13 +281,13 @@ TEST(JSONParser, WrongEmptyAndMinimalInputs) {
 TEST(JSONParser, UnicodeEdgeCases) {
   // Test various unicode characters
   EXPECT_EQ(json::Parse("\"\\u0000\"").cast<String>(), std::string("\0", 1));
-  // replace using \U to avoid encoding issues
-  EXPECT_EQ(json::Parse("\"\\u00FF\"").cast<String>(), u8"\U000000FF");
-  EXPECT_EQ(json::Parse("\"\\u4E2D\\u6587\"").cast<String>(), 
u8"\U00004E2D\U00006587");
+  // Use explicit UTF-8 bytes: C++20 u8 literals have char8_t elements, while 
String uses char.
+  EXPECT_EQ(json::Parse("\"\\u00FF\"").cast<String>(), "\xC3\xBF");
+  EXPECT_EQ(json::Parse("\"\\u4E2D\\u6587\"").cast<String>(), 
"\xE4\xB8\xAD\xE6\x96\x87");
 
   // Test multiple surrogate pairs
   EXPECT_EQ(json::Parse("\"\\uD83D\\uDE00\\uD83D\\uDE01\"").cast<String>(),
-            u8"\U0001F600\U0001F601");
+            "\xF0\x9F\x98\x80\xF0\x9F\x98\x81");
 }
 
 TEST(JSONParser, RawUTF8Bytes) {
@@ -357,10 +357,10 @@ TEST(JSONParser, MixedDataTypes) {
       {"boolean_false", false},
       {"integer", 42},
       {"negative_integer", -42},
-      {"float", 3.14159},
+      {"float", 3.14159},  // NOLINT(modernize-use-std-numbers): match the 
JSON decimal exactly.
       {"scientific", 1.23e-4},
       {"string", "hello world"},
-      {"unicode_string", u8"Hello \U00004E16\U0000754C \U0001F30D"},
+      {"unicode_string", "Hello \xE4\xB8\x96\xE7\x95\x8C \xF0\x9F\x8C\x8D"},
       {"empty_string", ""},
       {"empty_array", json::Array{}},
       {"empty_object", json::Object{}},
diff --git a/tests/python/test_libinfo.py b/tests/python/test_libinfo.py
index d58e8a9c..387b0cb7 100644
--- a/tests/python/test_libinfo.py
+++ b/tests/python/test_libinfo.py
@@ -89,7 +89,7 @@ def test_libs_reports_link_target() -> None:
 def test_cxxflags_include_paths_and_standard() -> None:
     include_dir = libinfo.find_include_path()
     dlpack_dir = libinfo.find_dlpack_include_path()
-    assert _stdout_for("--cxxflags") == f"-I{include_dir} -I{dlpack_dir} 
-std=c++17"
+    assert _stdout_for("--cxxflags") == f"-I{include_dir} -I{dlpack_dir} 
-std=c++20"
 
 
 def test_cflags_include_paths() -> None:

Reply via email to