From e3865f3b7f207b351cc67186063a9bc322de4b6c Mon Sep 17 00:00:00 2001
From: Marian Buschsieweke <marian.buschsieweke@posteo.net>
Date: Fri, 14 Mar 2025 09:43:33 +0100
Subject: [PATCH] testing/c2rust: upgrade to 0.20.0

---
 testing/c2rust/0001-link-clang-dynamic.patch  | 182 ++++-------------
 .../0003-fix-compilation-with-llvm20.patch    |  20 ++
 testing/c2rust/APKBUILD                       |  29 +--
 ...b55eae9ecfd4380004a513a10526ef8776cf.patch | 183 ------------------
 4 files changed, 69 insertions(+), 345 deletions(-)
 create mode 100644 testing/c2rust/0003-fix-compilation-with-llvm20.patch
 delete mode 100644 testing/c2rust/df42b55eae9ecfd4380004a513a10526ef8776cf.patch

diff --git a/testing/c2rust/0001-link-clang-dynamic.patch b/testing/c2rust/0001-link-clang-dynamic.patch
index 5c02fdca8219..27fd00b2aa07 100644
--- a/testing/c2rust/0001-link-clang-dynamic.patch
+++ b/testing/c2rust/0001-link-clang-dynamic.patch
@@ -1,31 +1,28 @@
 Link dynamically against libclang
-diff -rupN a/c2rust/Cargo.toml b/c2rust/Cargo.toml
---- a/c2rust/Cargo.toml	2024-01-06 22:49:13.145706727 +0100
-+++ b/c2rust/Cargo.toml	2024-01-06 22:49:56.895188304 +0100
-@@ -31,7 +31,3 @@ time-macros = "=0.2.6"
+diff --color -rupN a/c2rust/Cargo.toml b/c2rust/Cargo.toml
+--- a/c2rust/Cargo.toml	2025-02-24 14:19:52.000000000 +0100
++++ b/c2rust/Cargo.toml	2025-03-14 09:17:13.865581468 +0100
+@@ -28,7 +28,3 @@ c2rust-transpile = { version = "0.20.0",
  
  [build-dependencies]
- c2rust-build-paths = { path = "../c2rust-build-paths", version = "0.18.0" }
+ c2rust-build-paths = { path = "../c2rust-build-paths", version = "0.20.0" }
 -
 -[features]
 -# Force static linking of LLVM
 -llvm-static = ["c2rust-transpile/llvm-static"]
-diff -rupN a/c2rust-ast-exporter/Cargo.toml b/c2rust-ast-exporter/Cargo.toml
---- a/c2rust-ast-exporter/Cargo.toml	2024-01-06 22:49:13.132373552 +0100
-+++ b/c2rust-ast-exporter/Cargo.toml	2024-01-06 22:50:53.591183135 +0100
-@@ -24,8 +24,3 @@ clang-sys = "1.3"
- cmake = "0.1.49"
- env_logger = "0.10"
- c2rust-build-paths = { path = "../c2rust-build-paths", version = "0.18.0" }
--
--[features]
--default = []
+diff --color -rupN a/c2rust-ast-exporter/Cargo.toml b/c2rust-ast-exporter/Cargo.toml
+--- a/c2rust-ast-exporter/Cargo.toml	2025-02-24 14:19:52.000000000 +0100
++++ b/c2rust-ast-exporter/Cargo.toml	2025-03-14 09:17:44.335314550 +0100
+@@ -27,5 +27,3 @@ c2rust-build-paths = { path = "../c2rust
+ 
+ [features]
+ default = []
 -# Force static linking of LLVM
 -llvm-static = []
-diff -rupN a/c2rust-ast-exporter/build.rs b/c2rust-ast-exporter/build.rs
---- a/c2rust-ast-exporter/build.rs	2024-01-06 22:49:13.132373552 +0100
-+++ b/c2rust-ast-exporter/build.rs	2024-01-06 22:49:18.425644161 +0100
-@@ -147,55 +147,7 @@ fn build_native(llvm_info: &LLVMInfo) {
+diff --color -rupN a/c2rust-ast-exporter/build.rs b/c2rust-ast-exporter/build.rs
+--- a/c2rust-ast-exporter/build.rs	2025-02-24 14:19:52.000000000 +0100
++++ b/c2rust-ast-exporter/build.rs	2025-03-14 09:20:37.350465585 +0100
+@@ -155,63 +155,7 @@ fn build_native(llvm_info: &LLVMInfo) {
  
      println!("cargo:rustc-link-search=native={}", llvm_lib_dir);
  
@@ -54,12 +51,12 @@ diff -rupN a/c2rust-ast-exporter/build.rs b/c2rust-ast-exporter/build.rs
 -        let mut clang_libs = vec![
 -            "clangTooling",
 -            "clangFrontend",
--            "clangASTMatchers",
 -            "clangParse",
--            "clangSerialization",
 -            "clangSema",
--            "clangEdit",
 -            "clangAnalysis",
+-            "clangASTMatchers",
+-            "clangSerialization",
+-            "clangEdit",
 -            "clangDriver",
 -            "clangFormat",
 -            "clangToolingCore",
@@ -73,6 +70,14 @@ diff -rupN a/c2rust-ast-exporter/build.rs b/c2rust-ast-exporter/build.rs
 -            let sema_pos = clang_libs.iter().position(|&r| r == "clangSema").unwrap();
 -            clang_libs.insert(sema_pos + 1, "clangSupport");
 -        }
+-        if llvm_info.llvm_major_version >= 18 {
+-            // insert after clangSupport
+-            let sema_pos = clang_libs
+-                .iter()
+-                .position(|&r| r == "clangSupport")
+-                .unwrap();
+-            clang_libs.insert(sema_pos + 1, "clangAPINotes");
+-        }
 -
 -        for lib in &clang_libs {
 -            println!("cargo:rustc-link-lib={}", lib);
@@ -82,9 +87,9 @@ diff -rupN a/c2rust-ast-exporter/build.rs b/c2rust-ast-exporter/build.rs
  
      for lib in &llvm_info.libs {
          // IMPORTANT: We cannot specify static= or dylib= here because rustc
-diff -rupN a/c2rust-ast-exporter/src/CMakeLists.txt b/c2rust-ast-exporter/src/CMakeLists.txt
---- a/c2rust-ast-exporter/src/CMakeLists.txt	2024-01-06 22:49:13.132373552 +0100
-+++ b/c2rust-ast-exporter/src/CMakeLists.txt	2024-01-06 22:49:18.425644161 +0100
+diff --color -rupN a/c2rust-ast-exporter/src/CMakeLists.txt b/c2rust-ast-exporter/src/CMakeLists.txt
+--- a/c2rust-ast-exporter/src/CMakeLists.txt	2025-02-24 14:19:52.000000000 +0100
++++ b/c2rust-ast-exporter/src/CMakeLists.txt	2025-03-14 09:16:06.622837188 +0100
 @@ -95,11 +95,7 @@ set_target_properties(c2rust-ast-exporte
  # PRIVATE was added to make c2rust-ast-exporter build with LLVM 6.0. Keyword
  # description: https://cmake.org/pipermail/cmake/2016-May/063400.html
@@ -98,130 +103,9 @@ diff -rupN a/c2rust-ast-exporter/src/CMakeLists.txt b/c2rust-ast-exporter/src/CM
    tinycbor
    )
  
-diff -rupN a/c2rust-ast-exporter/src/CMakeLists.txt.orig b/c2rust-ast-exporter/src/CMakeLists.txt.orig
---- a/c2rust-ast-exporter/src/CMakeLists.txt.orig	1970-01-01 01:00:00.000000000 +0100
-+++ b/c2rust-ast-exporter/src/CMakeLists.txt.orig	2023-05-22 22:14:35.000000000 +0200
-@@ -0,0 +1,117 @@
-+cmake_minimum_required(VERSION 3.4.3)
-+project(ASTExporter)
-+
-+#################################################
-+# TinyCBOR                                      #
-+#################################################
-+
-+set(TINYCBOR_REPO "https://github.com/intel/tinycbor.git" CACHE STRING "tinycbor git repo URL")
-+
-+# v0.6.3 tag, but using the commit hash instead (of the tarball hash) for integrity checks
-+# unlike a .tar.gz MD5 hash, this SHA-1 commit hash should stay stable regardless of compression/archiving
-+# (GitHub has changed this), and still retains the integrity check
-+set(TINYCBOR_TAG "d393c16f3eb30d0c47e6f9d92db62272f0ec4dc7" CACHE STRING "tinycbor git tag/branch/commit hash")
-+
-+set(TINYCBOR_PREFIX "${CMAKE_BINARY_DIR}/tinycbor" CACHE STRING "tinycbor install prefix")
-+
-+if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
-+    set(MAKE "gmake")
-+else()
-+    set(MAKE "make")
-+endif()
-+
-+include(ExternalProject)
-+ExternalProject_Add(tinycbor_build
-+            PREFIX ${TINYCBOR_PREFIX}
-+            INSTALL_DIR ${CMAKE_BINARY_DIR}
-+            GIT_REPOSITORY ${TINYCBOR_REPO}
-+            GIT_TAG ${TINYCBOR_TAG}
-+            # the fd redirection here fails when the build run inside Cargo.
-+            # patch from upstream:
-+            # https://github.com/intel/tinycbor/commit/6176e0a28d7c5ef3a5e9cbd02521999c412de72c
-+            PATCH_COMMAND patch --forward -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/tinycbor_fix_build.patch || true
-+            CONFIGURE_COMMAND ${MAKE} .config && cat ${CMAKE_CURRENT_SOURCE_DIR}/tinycbor.config >> .config
-+            BUILD_COMMAND ${MAKE} --quiet prefix=<INSTALL_DIR> CFLAGS=-fPIC
-+            INSTALL_COMMAND ${MAKE} --quiet prefix=<INSTALL_DIR> install
-+            BUILD_IN_SOURCE 1
-+            BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/lib/libtinycbor.a
-+)
-+
-+include_directories(${CMAKE_BINARY_DIR}/include)
-+
-+add_library(tinycbor STATIC IMPORTED)
-+set_target_properties(tinycbor PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/libtinycbor.a)
-+add_dependencies(tinycbor tinycbor_build)
-+
-+set(AST_EXPORTER_SRCS
-+  AstExporter.cpp
-+  FloatingLexer.cpp
-+  ExportResult.cpp
-+  )
-+
-+set(AST_EXPORTER_BIN_SRCS
-+  ${AST_EXPORTER_SRCS}
-+  Main.cpp
-+  )
-+
-+find_package(LLVM REQUIRED CONFIG)
-+
-+# Debian and Ubuntu's clang cmake files are broken, so we can't require the
-+# package here. We already have to manually order the link against the clang
-+# libs in build.rs, so that's not so bad.
-+find_package(Clang CONFIG)
-+
-+include_directories(${LLVM_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS})
-+add_definitions(${LLVM_DEFINITIONS} ${CLANG_DEFINITIONS})
-+
-+if (DEFINED CLANG_INSTALL_PREFIX)
-+  add_definitions(-DCLANG_BIN_PATH="${CLANG_INSTALL_PREFIX}/bin")
-+elseif(DEFINED LLVM_INSTALL_PREFIX)
-+  add_definitions(-DCLANG_BIN_PATH="${LLVM_INSTALL_PREFIX}/bin")
-+elseif(DEFINED LLVM_TOOLS_BINARY_DIR)
-+  add_definitions(-DCLANG_BIN_PATH="${LLVM_TOOLS_BINARY_DIR}")
-+else()
-+  message(FATAL_ERROR "Cannot find path to clang binary")
-+endif()
-+add_definitions(-DCLANG_VERSION_STRING="${LLVM_PACKAGE_VERSION}")
-+
-+set(LLVM_LINK_COMPONENTS support)
-+
-+# LLVM is not always built with RTTI, we don't need it either.
-+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
-+
-+# The executable
-+add_executable(c2rust-ast-exporter ${AST_EXPORTER_BIN_SRCS})
-+
-+# The library
-+add_library(clangAstExporter STATIC ${AST_EXPORTER_SRCS})
-+
-+add_definitions(-DCLANG_LIBDIR_SUFFIX="${LLVM_LIBDIR_SUFFIX}")
-+
-+set_target_properties(c2rust-ast-exporter PROPERTIES
-+  CXX_STANDARD 14
-+  CXX_EXTENSIONS OFF
-+  )
-+# PRIVATE was added to make c2rust-ast-exporter build with LLVM 6.0. Keyword
-+# description: https://cmake.org/pipermail/cmake/2016-May/063400.html
-+target_link_libraries(c2rust-ast-exporter PRIVATE
-+  clangAST
-+  clangFrontend
-+  clangTooling
-+  clangBasic
-+  clangASTMatchers
-+  tinycbor
-+  )
-+
-+set_target_properties(clangAstExporter PROPERTIES
-+  CXX_STANDARD 17 # will decay to 14 if compiler doesn't support c++17
-+  CXX_EXTENSIONS OFF
-+  )
-+target_link_libraries(clangAstExporter PRIVATE
-+  clangAST
-+  clangFrontend
-+  clangTooling
-+  clangBasic
-+  clangASTMatchers
-+  tinycbor
-+  )
-diff -rupN a/c2rust-transpile/Cargo.toml b/c2rust-transpile/Cargo.toml
---- a/c2rust-transpile/Cargo.toml	2024-01-06 22:49:13.145706727 +0100
-+++ b/c2rust-transpile/Cargo.toml	2024-01-06 22:49:18.425644161 +0100
+diff --color -rupN a/c2rust-transpile/Cargo.toml b/c2rust-transpile/Cargo.toml
+--- a/c2rust-transpile/Cargo.toml	2025-02-24 14:19:52.000000000 +0100
++++ b/c2rust-transpile/Cargo.toml	2025-03-14 09:16:06.626170493 +0100
 @@ -38,7 +38,3 @@ smallvec = "1.0"
  strum = "0.24"
  strum_macros = "0.24"
diff --git a/testing/c2rust/0003-fix-compilation-with-llvm20.patch b/testing/c2rust/0003-fix-compilation-with-llvm20.patch
new file mode 100644
index 000000000000..1b8dd6f1e7f8
--- /dev/null
+++ b/testing/c2rust/0003-fix-compilation-with-llvm20.patch
@@ -0,0 +1,20 @@
+Adapts call side to the API change in LLVM20 of
+`unsigned int clang::FieldDecl::getBitWidthValue() const`
+--- a/c2rust-ast-exporter/src/AstExporter.cpp	2025-02-24 14:19:52.000000000 +0100
++++ b/c2rust-ast-exporter/src/AstExporter.cpp	2025-03-14 09:39:10.440335997 +0100
+@@ -2209,7 +2209,14 @@ class TranslateASTVisitor final
+                          // 2. Encode bitfield width if any
+                          if (D->isBitField()) {
+                              cbor_encode_uint(
+-                                 array, D->getBitWidthValue(*this->Context));
++                                 array,
++
++#if CLANG_VERSION_MAJOR >= 20
++                                D->getBitWidthValue()
++#else
++                                D->getBitWidthValue(*this->Context)
++#endif
++                            );
+                          } else {
+                              cbor_encode_null(array);
+                          };
diff --git a/testing/c2rust/APKBUILD b/testing/c2rust/APKBUILD
index 9cf83c2930d3..da2af3746051 100644
--- a/testing/c2rust/APKBUILD
+++ b/testing/c2rust/APKBUILD
@@ -1,8 +1,8 @@
 # Contributor: Marian Buschsieweke <marian.buschsieweke@posteo.net>
 # Maintainer: Marian Buschsieweke <marian.buschsieweke@posteo.net>
 pkgname=c2rust
-pkgver=0.18.0
-pkgrel=1
+pkgver=0.20.0
+pkgrel=0
 pkgdesc="Transpile C99-compliant code to (unsafe) Rust code"
 url="https://github.com/immunant/c2rust"
 # riscv64, loongarch64: libc crate sup
@@ -10,19 +10,21 @@ url="https://github.com/immunant/c2rust"
 # ppc64le: tinycbor not packaged due to segfault in unit tests
 arch="all !riscv64 !s390x !ppc64le !loongarch64"
 license="BSD-3-Clause"
-# Note: LLVM's CMake hooks check for presence of static libs and complain if
-# they are missing. So they are needed for building even when linking
+# Note: LLVM's CMake hooks check for presence of static libs and tools and
+# failif they are missing. So they are needed for building even when linking
 # dynamically
+_llvmver=20
 makedepends="
 	cargo
 	cargo-auditable
-	clang17-dev
-	clang17-static
+	clang$_llvmver-dev
+	clang$_llvmver-extra-tools
+	clang$_llvmver-static
 	cmake
 	libxml2-dev
-	llvm17-dev
-	llvm17-gtest
-	llvm17-static
+	llvm$_llvmver-dev
+	llvm$_llvmver-gtest
+	llvm$_llvmver-static
 	ncurses-dev
 	openssl-dev
 	rust
@@ -37,7 +39,7 @@ source="
 	$pkgname-$pkgver.tar.gz::https://github.com/immunant/c2rust/archive/refs/tags/v$pkgver.tar.gz
 	0001-link-clang-dynamic.patch
 	0002-use-system-tinycbor.patch
-	df42b55eae9ecfd4380004a513a10526ef8776cf.patch
+	0003-fix-compilation-with-llvm20.patch
 	"
 
 # Unit tests all fail using rust 1.72.1 with:
@@ -58,6 +60,7 @@ prepare() {
 }
 
 build() {
+	export PATH="$PATH:/usr/lib/llvm$_llvmver/bin/"
 	cargo auditable build --release --frozen --package c2rust
 }
 
@@ -73,8 +76,8 @@ package() {
 }
 
 sha512sums="
-16033110923d22d12c55bdd13aacbeb05b95a54b93b8eabf478b111e99fba6c523102e871f4812d35152a9c02fae39ee25307acdfbe6d7bef23113f5c9db8dde  c2rust-0.18.0.tar.gz
-3bd7def407277482a33c5074388a10afadf1b40b3f09e2fc87e9942a802b65ca2ee356be56e4baa66d669c57dcfd52ef27d59e740f0c735eb09c03fbf21015bb  0001-link-clang-dynamic.patch
+96d045da1856fb0d2d8475763dde11886ed25713c56ee16aa43e07b6a830472d83297fb87ae5749d0b07085a0c3d1d877b0b467052f7330075fe065c76af34fc  c2rust-0.20.0.tar.gz
+423079102d0a350a2b2ba80e6f3f2c70f76db2d5d062d7308d217ea9a2608a521ae11b10b85733d12824284971a65af5fc598eedb29b4796f44ec689e5a553b1  0001-link-clang-dynamic.patch
 be29e0f4576301b64f5fc38684ddb90e469526be4ce8ef428feee0d5962748c428045dcb81635ff92e132daebb1fa1b338a81ce1ea13d02b802ec057d0653b93  0002-use-system-tinycbor.patch
-34764bd19f927bff11e86a26f6826b0875abebfb78256d895d36e04cf16f9a98ac8672ba7de0891613112e3aef724c501045ab303093c3fcad135590c82f3506  df42b55eae9ecfd4380004a513a10526ef8776cf.patch
+c4e7d0d837087b0adaa0ce740e101c9e0128590d2705020241495bca1e56ed1d551f75ccc4d73bfec4ed485ef06b2017c3e5060ee76f0079070fa41e10b1a72f  0003-fix-compilation-with-llvm20.patch
 "
diff --git a/testing/c2rust/df42b55eae9ecfd4380004a513a10526ef8776cf.patch b/testing/c2rust/df42b55eae9ecfd4380004a513a10526ef8776cf.patch
deleted file mode 100644
index 83d0b8796ae4..000000000000
--- a/testing/c2rust/df42b55eae9ecfd4380004a513a10526ef8776cf.patch
+++ /dev/null
@@ -1,183 +0,0 @@
-From df42b55eae9ecfd4380004a513a10526ef8776cf Mon Sep 17 00:00:00 2001
-From: Per Larsen <perl@immunant.com>
-Date: Fri, 3 Nov 2023 16:18:56 -0700
-Subject: [PATCH] Add support for LLVM17. Closes #1039.
-
-Also adds extremely limited support for ARMs scalable vector
-extension types such that Apple Silicon macs can run unit tests..
----
- c2rust-ast-exporter/src/AstExporter.cpp  | 27 ++++++++++++++++++++++--
- c2rust-ast-exporter/src/ast_tags.hpp     |  6 ++++++
- c2rust-transpile/src/c_ast/conversion.rs |  9 ++++++++
- c2rust-transpile/src/c_ast/iterators.rs  |  2 +-
- c2rust-transpile/src/c_ast/mod.rs        |  4 ++++
- c2rust-transpile/src/translator/mod.rs   |  3 +++
- 6 files changed, 48 insertions(+), 3 deletions(-)
-
-diff --git a/c2rust-ast-exporter/src/AstExporter.cpp b/c2rust-ast-exporter/src/AstExporter.cpp
-index b58308e51f..fc6e78aec1 100644
---- a/c2rust-ast-exporter/src/AstExporter.cpp
-+++ b/c2rust-ast-exporter/src/AstExporter.cpp
-@@ -85,6 +85,7 @@ std::string make_realpath(std::string const &path) {
- }
- 
- // Helper to smooth out differences between versions of clang
-+#if CLANG_VERSION_MAJOR < 17
- Optional<APSInt> getIntegerConstantExpr(const Expr &E, const ASTContext &Ctx) {
- #if CLANG_VERSION_MAJOR < 12
-     APSInt value;
-@@ -96,6 +97,13 @@ Optional<APSInt> getIntegerConstantExpr(const Expr &E, const ASTContext &Ctx) {
-     return E.getIntegerConstantExpr(Ctx);
- #endif // CLANG_VERSION_MAJOR
- }
-+#else
-+#include <optional>
-+std::optional<APSInt> getIntegerConstantExpr(const Expr &E,
-+                                             const ASTContext &Ctx) {
-+    return E.getIntegerConstantExpr(Ctx);
-+}
-+#endif // CLANG_VERSION_MAJOR
- } // namespace
- 
- class TranslateASTVisitor;
-@@ -363,7 +371,7 @@ class TypeEncoder final : public TypeVisitor<TypeEncoder> {
-                 }
-             }();
-             // All the SVE types present in Clang 10 are 128-bit vectors
--            // (see `AArch64SVEACLETypes.def`), so we can divide 128 
-+            // (see `AArch64SVEACLETypes.def`), so we can divide 128
-             // by their element size to get element count.
-             auto ElemCount = 128 / Context->getTypeSize(ElemType);
- #endif // CLANG_VERSION_MAJOR >= 11
-@@ -403,7 +411,7 @@ class TypeEncoder final : public TypeVisitor<TypeEncoder> {
-             // Constructed as a consequence of the conversion of
-             // built-in to normal vector types.
-             case BuiltinType::Float16: return TagHalf;
--            case BuiltinType::Half: return TagHalf;     
-+            case BuiltinType::Half: return TagHalf;
-             #if CLANG_VERSION_MAJOR >= 11
-             case BuiltinType::BFloat16: return TagBFloat16;
-             #endif
-@@ -418,6 +426,12 @@ class TypeEncoder final : public TypeVisitor<TypeEncoder> {
-             case BuiltinType::Bool: return TagBool;
-             case BuiltinType::WChar_S: return TagSWChar;
-             case BuiltinType::WChar_U: return TagUWChar;
-+#if CLANG_VERSION_MAJOR >= 16
-+            case BuiltinType::SveCount: return TagSveCount;
-+            case BuiltinType::SveBool: return TagSveBool;
-+            case BuiltinType::SveBoolx2: return TagSveBoolx2;
-+            case BuiltinType::SveBoolx4: return TagSveBoolx4;
-+#endif
-             }
-         }();
- 
-@@ -1499,7 +1513,11 @@ class TranslateASTVisitor final
-                         cbor_encoder_create_array(&array, &entry, 2);
-                         cbor_encode_int(&entry, 2);
-                         cbor_encode_uint(&entry,
-+#if CLANG_VERSION_MAJOR < 17
-                                          uintptr_t(designator.getField()));
-+#else
-+                                         uintptr_t(designator.getFieldDecl()));
-+#endif // CLANG_VERSION_MAJOR
-                     } else if (designator.isArrayRangeDesignator()) {
-                         cbor_encoder_create_array(&array, &entry, 3);
-                         cbor_encode_int(&entry, 3);
-@@ -2300,6 +2318,11 @@ class TranslateASTVisitor final
-             case clang::StringLiteral::StringKind::UTF32:
-                 cbor_encode_uint(array, StringTypeTag::TagUTF32);
-                 break;
-+#if CLANG_VERSION_MAJOR >= 17
-+            case clang::StringLiteral::StringKind::Unevaluated:
-+                cbor_encode_uint(array, StringTypeTag::TagUnevaluated);
-+                break;
-+#endif // CLANG_VERSION_MAJOR
-             }
-             // The size of the wchar_t type in C is implementation defined
-             cbor_encode_uint(array, SL->getCharByteWidth());
-diff --git a/c2rust-ast-exporter/src/ast_tags.hpp b/c2rust-ast-exporter/src/ast_tags.hpp
-index ab6e87344b..2027957d5f 100644
---- a/c2rust-ast-exporter/src/ast_tags.hpp
-+++ b/c2rust-ast-exporter/src/ast_tags.hpp
-@@ -142,6 +142,11 @@ enum TypeTag {
-     TagComplexType,
-     TagHalf,
-     TagBFloat16,
-+
-+    TagSveCount,
-+    TagSveBool,
-+    TagSveBoolx2,
-+    TagSveBoolx4,
- };
- 
- enum StringTypeTag {
-@@ -150,6 +155,7 @@ enum StringTypeTag {
-     TagUTF8,
-     TagUTF16,
-     TagUTF32,
-+    TagUnevaluated,
- };
- 
- // From `clang/Basic/TargetInfo.h`
-diff --git a/c2rust-transpile/src/c_ast/conversion.rs b/c2rust-transpile/src/c_ast/conversion.rs
-index 26033bf0ae..3fe769fca5 100644
---- a/c2rust-transpile/src/c_ast/conversion.rs
-+++ b/c2rust-transpile/src/c_ast/conversion.rs
-@@ -804,6 +804,15 @@ impl ConversionContext {
-                     self.processed_nodes.insert(new_id, OTHER_TYPE);
-                 }
- 
-+                TypeTag::TagSveCount
-+                | TypeTag::TagSveBool
-+                | TypeTag::TagSveBoolx2
-+                | TypeTag::TagSveBoolx4 => {
-+                    let ty = CTypeKind::UnhandledSveType;
-+                    self.add_type(new_id, not_located(ty));
-+                    self.processed_nodes.insert(new_id, OTHER_TYPE);
-+                }
-+
-                 TypeTag::TagVectorType => {
-                     let elt =
-                         from_value(ty_node.extras[0].clone()).expect("Vector child not found");
-diff --git a/c2rust-transpile/src/c_ast/iterators.rs b/c2rust-transpile/src/c_ast/iterators.rs
-index 6817cf1e1a..22ba07e71c 100644
---- a/c2rust-transpile/src/c_ast/iterators.rs
-+++ b/c2rust-transpile/src/c_ast/iterators.rs
-@@ -285,7 +285,7 @@ fn immediate_type_children(kind: &CTypeKind) -> Vec<SomeId> {
-         TypeOfExpr(e) => intos![e],
-         Void | Bool | Short | Int | Long | LongLong | UShort | UInt | ULong | ULongLong | SChar
-         | UChar | Char | Double | LongDouble | Float | Int128 | UInt128 | BuiltinFn | Half
--        | BFloat16 => {
-+        | BFloat16 | UnhandledSveType => {
-             vec![]
-         }
- 
-diff --git a/c2rust-transpile/src/c_ast/mod.rs b/c2rust-transpile/src/c_ast/mod.rs
-index 56b067f3e8..182b795812 100644
---- a/c2rust-transpile/src/c_ast/mod.rs
-+++ b/c2rust-transpile/src/c_ast/mod.rs
-@@ -1672,6 +1672,10 @@ pub enum CTypeKind {
- 
-     Half,
-     BFloat16,
-+
-+    // ARM Scalable Vector Extention types
-+    // TODO: represent all the individual types in AArch64SVEACLETypes.def
-+    UnhandledSveType,
- }
- 
- impl CTypeKind {
-diff --git a/c2rust-transpile/src/translator/mod.rs b/c2rust-transpile/src/translator/mod.rs
-index 91144d0f29..99dca9734e 100644
---- a/c2rust-transpile/src/translator/mod.rs
-+++ b/c2rust-transpile/src/translator/mod.rs
-@@ -4921,6 +4921,9 @@ impl<'c> Translation<'c> {
-                 // Handled in `import_simd_typedef`
-             }
-             TypeOfExpr(_) | BuiltinFn => {}
-+            UnhandledSveType => {
-+                // TODO: handle SVE types
-+            }
-         }
-     }
- 
-- 
GitLab