Convert "__auto_type" to "auto", defining a macro for "auto"

unless C23+ is in use.
 
 ---
  arch/nios2/include/asm/uaccess.h                      |  8 ++++----
  arch/x86/include/asm/bug.h                            |  2 +-
  arch/x86/include/asm/string_64.h                      |  6 +++---
  arch/x86/include/asm/uaccess_64.h                     |  2 +-
  fs/proc/inode.c                                       | 19 +++++++++----------
  include/linux/cleanup.h                               |  6 +++---
  include/linux/compiler.h                              |  2 +-
  include/linux/compiler_types.h                        | 13 +++++++++++++
  include/linux/minmax.h                                |  6 +++---
  .../testing/selftests/bpf/prog_tests/socket_helpers.h |  9 +++++++--
  tools/virtio/linux/compiler.h                         |  2 +-
  11 files changed, 46 insertions(+), 29 deletions(-)
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEbQEHvGnuWidP2bYMLbPDMhtt34YFAmk4grQACgkQLbPDMhtt
 34Z9zQ//VKM0xKkCGVPfRBbL33O+DIcDfZjk6jokAl47aKAwJxrSTfT+Hdnmwsnv
 i7gKwaioYxDjnZlsfCzDbwbHexPTMGjsjgRNmFK3uS1mv1AhTspV2Jjn9qiYzd5o
 N+Cvzv7eIr88ti1dKe+7MZBa9j37nsGKZDzT0M/GubBlzIgMzeCZ6xAxOOV/TmD9
 sP17oU65MhczegpXH/fcxyK7atkvlWskPfc+50YB5T3C96hqzT0LDiU/vBSHIJ8z
 EyqSRYlt2To17BdcKQEKYcklduFZwJ/02UWDT4RYJRGBSkn6ohPJJwYsjI5Cvl5m
 9yPRLLqW/LsA5O5CZ/mq/tM0xiDdm5dCTEEbiwk90Lg1XTVxmpbTbMjjN1MCAy+a
 HYjsq9nWkYl9xXVBHk7CqgAjITAV7Z4ZZN//JLrJleQsD794EP3vYBzEaa370deP
 L22lONVSjpPm6m+Rr1fjObRDFQxs4piobUavxIj2JKaF48G8mSA0uAOG0nBRQkR1
 jOTsMhqH33z9XNxb52BlFdaVkQGkHNlLeONc/ivGiDMKox5oCb/gveKOQ+PXYnLN
 IRTllLqke0fuOQrgLa5lu135J6ZbPHDOgH+P19OwNrBQnOMQqzTr7DnENVoanIy7
 ocVc6vS3OX4qhZ+7uVpHugbnSCWOoCzBgV4xcZrIdh4qpTKzM+g=
 =Cu2O
 -----END PGP SIGNATURE-----

Merge tag 'auto-type-conversion-for-v6.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-auto

Pull __auto_type to auto conversion from Peter Anvin:
 "Convert '__auto_type' to 'auto', defining a macro for 'auto' unless
  C23+ is in use"

* tag 'auto-type-conversion-for-v6.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-auto:
  tools/virtio: replace "__auto_type" with "auto"
  selftests/bpf: replace "__auto_type" with "auto"
  arch/x86: replace "__auto_type" with "auto"
  arch/nios2: replace "__auto_type" and adjacent equivalent with "auto"
  fs/proc: replace "__auto_type" with "const auto"
  include/linux: change "__auto_type" to "auto"
  compiler_types.h: add "auto" as a macro for "__auto_type"
pull/1354/merge
Linus Torvalds 2025-12-10 05:41:10 +09:00
commit c752c21c90
11 changed files with 46 additions and 29 deletions

View File

@ -172,15 +172,15 @@ do { \
#define __put_user(x, ptr) \ #define __put_user(x, ptr) \
({ \ ({ \
__auto_type __pu_ptr = (ptr); \ auto __pu_ptr = (ptr); \
typeof(*__pu_ptr) __pu_val = (typeof(*__pu_ptr))(x); \ auto __pu_val = (typeof(*__pu_ptr))(x); \
__put_user_common(__pu_val, __pu_ptr); \ __put_user_common(__pu_val, __pu_ptr); \
}) })
#define put_user(x, ptr) \ #define put_user(x, ptr) \
({ \ ({ \
__auto_type __pu_ptr = (ptr); \ auto __pu_ptr = (ptr); \
typeof(*__pu_ptr) __pu_val = (typeof(*__pu_ptr))(x); \ auto __pu_val = (typeof(*__pu_ptr))(x); \
access_ok(__pu_ptr, sizeof(*__pu_ptr)) ? \ access_ok(__pu_ptr, sizeof(*__pu_ptr)) ? \
__put_user_common(__pu_val, __pu_ptr) : \ __put_user_common(__pu_val, __pu_ptr) : \
-EFAULT; \ -EFAULT; \

View File

@ -129,7 +129,7 @@ do { \
#define __WARN_FLAGS(cond_str, flags) \ #define __WARN_FLAGS(cond_str, flags) \
do { \ do { \
__auto_type __flags = BUGFLAG_WARNING|(flags); \ auto __flags = BUGFLAG_WARNING|(flags); \
instrumentation_begin(); \ instrumentation_begin(); \
_BUG_FLAGS(cond_str, ASM_UD2, __flags, ARCH_WARN_REACHABLE); \ _BUG_FLAGS(cond_str, ASM_UD2, __flags, ARCH_WARN_REACHABLE); \
instrumentation_end(); \ instrumentation_end(); \

View File

@ -31,7 +31,7 @@ KCFI_REFERENCE(__memset);
#define __HAVE_ARCH_MEMSET16 #define __HAVE_ARCH_MEMSET16
static inline void *memset16(uint16_t *s, uint16_t v, size_t n) static inline void *memset16(uint16_t *s, uint16_t v, size_t n)
{ {
const __auto_type s0 = s; const auto s0 = s;
asm volatile ( asm volatile (
"rep stosw" "rep stosw"
: "+D" (s), "+c" (n) : "+D" (s), "+c" (n)
@ -44,7 +44,7 @@ static inline void *memset16(uint16_t *s, uint16_t v, size_t n)
#define __HAVE_ARCH_MEMSET32 #define __HAVE_ARCH_MEMSET32
static inline void *memset32(uint32_t *s, uint32_t v, size_t n) static inline void *memset32(uint32_t *s, uint32_t v, size_t n)
{ {
const __auto_type s0 = s; const auto s0 = s;
asm volatile ( asm volatile (
"rep stosl" "rep stosl"
: "+D" (s), "+c" (n) : "+D" (s), "+c" (n)
@ -57,7 +57,7 @@ static inline void *memset32(uint32_t *s, uint32_t v, size_t n)
#define __HAVE_ARCH_MEMSET64 #define __HAVE_ARCH_MEMSET64
static inline void *memset64(uint64_t *s, uint64_t v, size_t n) static inline void *memset64(uint64_t *s, uint64_t v, size_t n)
{ {
const __auto_type s0 = s; const auto s0 = s;
asm volatile ( asm volatile (
"rep stosq" "rep stosq"
: "+D" (s), "+c" (n) : "+D" (s), "+c" (n)

View File

@ -72,7 +72,7 @@ static inline void __user *mask_user_address(const void __user *ptr)
return ret; return ret;
} }
#define masked_user_access_begin(x) ({ \ #define masked_user_access_begin(x) ({ \
__auto_type __masked_ptr = (x); \ auto __masked_ptr = (x); \
__masked_ptr = mask_user_address(__masked_ptr); \ __masked_ptr = mask_user_address(__masked_ptr); \
__uaccess_begin(); __masked_ptr; }) __uaccess_begin(); __masked_ptr; })

View File

@ -303,7 +303,7 @@ static ssize_t proc_reg_read_iter(struct kiocb *iocb, struct iov_iter *iter)
static ssize_t pde_read(struct proc_dir_entry *pde, struct file *file, char __user *buf, size_t count, loff_t *ppos) static ssize_t pde_read(struct proc_dir_entry *pde, struct file *file, char __user *buf, size_t count, loff_t *ppos)
{ {
__auto_type read = pde->proc_ops->proc_read; const auto read = pde->proc_ops->proc_read;
if (read) if (read)
return read(file, buf, count, ppos); return read(file, buf, count, ppos);
return -EIO; return -EIO;
@ -325,7 +325,7 @@ static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count,
static ssize_t pde_write(struct proc_dir_entry *pde, struct file *file, const char __user *buf, size_t count, loff_t *ppos) static ssize_t pde_write(struct proc_dir_entry *pde, struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{ {
__auto_type write = pde->proc_ops->proc_write; const auto write = pde->proc_ops->proc_write;
if (write) if (write)
return write(file, buf, count, ppos); return write(file, buf, count, ppos);
return -EIO; return -EIO;
@ -347,7 +347,7 @@ static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t
static __poll_t pde_poll(struct proc_dir_entry *pde, struct file *file, struct poll_table_struct *pts) static __poll_t pde_poll(struct proc_dir_entry *pde, struct file *file, struct poll_table_struct *pts)
{ {
__auto_type poll = pde->proc_ops->proc_poll; const auto poll = pde->proc_ops->proc_poll;
if (poll) if (poll)
return poll(file, pts); return poll(file, pts);
return DEFAULT_POLLMASK; return DEFAULT_POLLMASK;
@ -369,7 +369,7 @@ static __poll_t proc_reg_poll(struct file *file, struct poll_table_struct *pts)
static long pde_ioctl(struct proc_dir_entry *pde, struct file *file, unsigned int cmd, unsigned long arg) static long pde_ioctl(struct proc_dir_entry *pde, struct file *file, unsigned int cmd, unsigned long arg)
{ {
__auto_type ioctl = pde->proc_ops->proc_ioctl; const auto ioctl = pde->proc_ops->proc_ioctl;
if (ioctl) if (ioctl)
return ioctl(file, cmd, arg); return ioctl(file, cmd, arg);
return -ENOTTY; return -ENOTTY;
@ -392,7 +392,7 @@ static long proc_reg_unlocked_ioctl(struct file *file, unsigned int cmd, unsigne
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
static long pde_compat_ioctl(struct proc_dir_entry *pde, struct file *file, unsigned int cmd, unsigned long arg) static long pde_compat_ioctl(struct proc_dir_entry *pde, struct file *file, unsigned int cmd, unsigned long arg)
{ {
__auto_type compat_ioctl = pde->proc_ops->proc_compat_ioctl; const auto compat_ioctl = pde->proc_ops->proc_compat_ioctl;
if (compat_ioctl) if (compat_ioctl)
return compat_ioctl(file, cmd, arg); return compat_ioctl(file, cmd, arg);
return -ENOTTY; return -ENOTTY;
@ -414,7 +414,7 @@ static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned
static int pde_mmap(struct proc_dir_entry *pde, struct file *file, struct vm_area_struct *vma) static int pde_mmap(struct proc_dir_entry *pde, struct file *file, struct vm_area_struct *vma)
{ {
__auto_type mmap = pde->proc_ops->proc_mmap; const auto mmap = pde->proc_ops->proc_mmap;
if (mmap) if (mmap)
return mmap(file, vma); return mmap(file, vma);
return -EIO; return -EIO;
@ -497,7 +497,7 @@ static int proc_reg_open(struct inode *inode, struct file *file)
if (!use_pde(pde)) if (!use_pde(pde))
return -ENOENT; return -ENOENT;
__auto_type release = pde->proc_ops->proc_release; const auto release = pde->proc_ops->proc_release;
if (release) { if (release) {
pdeo = kmem_cache_alloc(pde_opener_cache, GFP_KERNEL); pdeo = kmem_cache_alloc(pde_opener_cache, GFP_KERNEL);
if (!pdeo) { if (!pdeo) {
@ -534,10 +534,9 @@ static int proc_reg_release(struct inode *inode, struct file *file)
struct pde_opener *pdeo; struct pde_opener *pdeo;
if (pde_is_permanent(pde)) { if (pde_is_permanent(pde)) {
__auto_type release = pde->proc_ops->proc_release; const auto release = pde->proc_ops->proc_release;
if (release) { if (release)
return release(inode, file); return release(inode, file);
}
return 0; return 0;
} }

View File

@ -212,10 +212,10 @@
#define __free(_name) __cleanup(__free_##_name) #define __free(_name) __cleanup(__free_##_name)
#define __get_and_null(p, nullvalue) \ #define __get_and_null(p, nullvalue) \
({ \ ({ \
__auto_type __ptr = &(p); \ auto __ptr = &(p); \
__auto_type __val = *__ptr; \ auto __val = *__ptr; \
*__ptr = nullvalue; \ *__ptr = nullvalue; \
__val; \ __val; \
}) })

View File

@ -190,7 +190,7 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
#define data_race(expr) \ #define data_race(expr) \
({ \ ({ \
__kcsan_disable_current(); \ __kcsan_disable_current(); \
__auto_type __v = (expr); \ auto __v = (expr); \
__kcsan_enable_current(); \ __kcsan_enable_current(); \
__v; \ __v; \
}) })

View File

@ -17,6 +17,19 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/*
* C23 introduces "auto" as a standard way to define type-inferred
* variables, but "auto" has been a (useless) keyword even since K&R C,
* so it has always been "namespace reserved."
*
* Until at some future time we require C23 support, we need the gcc
* extension __auto_type, but there is no reason to put that elsewhere
* in the source code.
*/
#if __STDC_VERSION__ < 202311L
# define auto __auto_type
#endif
/* /*
* Skipped when running bindgen due to a libclang issue; * Skipped when running bindgen due to a libclang issue;
* see https://github.com/rust-lang/rust-bindgen/issues/2244. * see https://github.com/rust-lang/rust-bindgen/issues/2244.

View File

@ -89,7 +89,7 @@
__cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_)) __cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
#define __careful_cmp_once(op, x, y, ux, uy) ({ \ #define __careful_cmp_once(op, x, y, ux, uy) ({ \
__auto_type ux = (x); __auto_type uy = (y); \ auto ux = (x); auto uy = (y); \
BUILD_BUG_ON_MSG(!__types_ok(ux, uy), \ BUILD_BUG_ON_MSG(!__types_ok(ux, uy), \
#op"("#x", "#y") signedness error"); \ #op"("#x", "#y") signedness error"); \
__cmp(op, ux, uy); }) __cmp(op, ux, uy); })
@ -129,7 +129,7 @@
__careful_cmp(max, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull) __careful_cmp(max, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull)
#define __careful_op3(op, x, y, z, ux, uy, uz) ({ \ #define __careful_op3(op, x, y, z, ux, uy, uz) ({ \
__auto_type ux = (x); __auto_type uy = (y);__auto_type uz = (z);\ auto ux = (x); auto uy = (y); auto uz = (z); \
BUILD_BUG_ON_MSG(!__types_ok3(ux, uy, uz), \ BUILD_BUG_ON_MSG(!__types_ok3(ux, uy, uz), \
#op"3("#x", "#y", "#z") signedness error"); \ #op"3("#x", "#y", "#z") signedness error"); \
__cmp(op, ux, __cmp(op, uy, uz)); }) __cmp(op, ux, __cmp(op, uy, uz)); })
@ -203,7 +203,7 @@
* This macro checks @val/@lo/@hi to make sure they have compatible * This macro checks @val/@lo/@hi to make sure they have compatible
* signedness. * signedness.
*/ */
#define clamp(val, lo, hi) __careful_clamp(__auto_type, val, lo, hi) #define clamp(val, lo, hi) __careful_clamp(auto, val, lo, hi)
/** /**
* clamp_t - return a value clamped to a given range using a given type * clamp_t - return a value clamped to a given range using a given type

View File

@ -17,11 +17,16 @@
#define VMADDR_CID_LOCAL 1 #define VMADDR_CID_LOCAL 1
#endif #endif
/* include/linux/compiler_types.h */
#if __STDC_VERSION__ < 202311L && !defined(auto)
# define auto __auto_type
#endif
/* include/linux/cleanup.h */ /* include/linux/cleanup.h */
#define __get_and_null(p, nullvalue) \ #define __get_and_null(p, nullvalue) \
({ \ ({ \
__auto_type __ptr = &(p); \ auto __ptr = &(p); \
__auto_type __val = *__ptr; \ auto __val = *__ptr; \
*__ptr = nullvalue; \ *__ptr = nullvalue; \
__val; \ __val; \
}) })

View File

@ -31,7 +31,7 @@
*/ */
#define data_race(expr) \ #define data_race(expr) \
({ \ ({ \
__auto_type __v = (expr); \ auto __v = (expr); \
__v; \ __v; \
}) })