From: Al Viro <viro@zeniv.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: "Eric Dumazet" <edumazet@google.com>,
oe-kbuild-all@lists.linux.dev, linux-kernel@vger.kernel.org,
"Jakub Kicinski" <kuba@kernel.org>,
"Maciej Żenczykowski" <maze@google.com>,
"Will Deacon" <will@kernel.org>,
"Paul E. McKenney" <paulmck@kernel.org>,
"Peter Zijlstra" <peterz@infradead.org>
Subject: Re: include/net/sock.h:2100:16: sparse: sparse: cast to non-scalar
Date: Sun, 11 Jan 2026 18:20:10 +0000 [thread overview]
Message-ID: <20260111182010.GH3634291@ZenIV> (raw)
In-Reply-To: <20260110223548.GA4041651@ZenIV>
On Sat, Jan 10, 2026 at 10:35:48PM +0000, Al Viro wrote:
> Folks involved in putting that cast in arch/alpha/include/asm/rwonce.h Cc'd...
FWIW, there's a way to strip qualifiers from *any* non-array type.
Look:
void f(void)
{
const int x;
x = 1; // an error
typeof(((typeof(x)(*)(void))0)()) y;
y = 2; // perfectly fine
}
The way it works is that qualifiers are stripped from return type when
deriving a function type. That was spelled out only in C17; 6.7.6.3[5]
| If, in the declaration "T D1", D1 has the form
| D ( parameter-type-list )
| or
| D ( identifier-list[opt] )
| and the type specified for ident in the declaration "T D" is
| "derived-declarator-type-list T", then the type specified for ident
| is "derived-declarator-type-list function returning the unqualified version
| of T".
but that "unqualified version of..." matched the common practice in
earlier variants of standard; they stopped issuing TCs by that point
(~2014), but both clang and gcc behave that way with any variant of
standard.
IOW, this
#define unqual_non_array(T) __typeof__(((T(*)(void))0)())
would do the right thing without that _Generic cascade and it'll work
just fine for e.g. kuid_t. Using it for an array would trigger an error,
array-returning functions being forbidden...
Guys, do you have any problems with replacing __unqual_scalar_typeof()
uses with that thing?
As in,#ifndef __smp_load_acquire
#define __smp_load_acquire(p) \
({ \
unqual_non_array(__typeof__(*p)) ___p1 = READ_ONCE(*p); \
...
Objections? IMO it's more palatable than current __unqual_scalar_typeof()...
next prev parent reply other threads:[~2026-01-11 18:18 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-10 21:06 include/net/sock.h:2100:16: sparse: sparse: cast to non-scalar kernel test robot
2026-01-10 22:15 ` Al Viro
2026-01-10 22:35 ` Al Viro
2026-01-11 10:08 ` Eric Dumazet
2026-01-12 12:33 ` Peter Zijlstra
2026-01-11 18:20 ` Al Viro [this message]
2026-01-11 18:51 ` Al Viro
2026-01-12 12:37 ` Peter Zijlstra
2026-01-12 15:02 ` Will Deacon
2026-01-12 19:21 ` Al Viro
2026-01-12 21:16 ` Al Viro
2026-01-12 22:39 ` David Laight
2026-01-13 0:28 ` Al Viro
2026-01-12 12:32 ` Peter Zijlstra
2026-01-12 19:30 ` Al Viro
2026-01-13 15:27 ` Peter Zijlstra
2026-01-12 0:49 ` Philip Li
-- strict thread matches above, loose matches on Subject: below --
2025-12-06 10:09 kernel test robot
2025-08-25 4:45 kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260111182010.GH3634291@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maze@google.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=torvalds@linux-foundation.org \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.