Hi! On 1/30/23 03:05, наб wrote:
Hi! On Sun, Jan 29, 2023 at 05:41:56PM +0100, Alejandro Colomar wrote:On 1/29/23 17:31, наб wrote:+.PP +.I tv_nsec +is of an implementation-defined signed type capable of holding the specified range.Would you mind using interval here?I don't think it makes sense here? Since (a) this is the standards phrasing and (b) the /range/ of values is represented by an interval.
Makes sense.
We could just as well say "all integers between 0 and 999`999`999", or "integers at least 0 and smaller 1e9", which are both identical, but aren't intervals per se. Or consider a similar case, where the range would be "[0, 2^31-1] ∪ {EOF}" ‒ you wouldn't call that an interval, but it's a valid set expression; timespec.3type is just a degenerate case.
I just checked again, and I was confused by the statistics definition of range, which seems to be more available in Big Search Engine.
There's a second definition which matches this, which I didn't find last time. <https://sciencing.com/what-range-mathematics-4865897.html>
In general, we're concerned with the logical object here ("the domain" or, well "range [of values]"), not the implementation detail ("it's spelled with an interval"). Plus, I'd never search for "interval", but most people would probably grep for "range", because that's the sanest spelling.
:)
-This is a long-standing and long-enshrined glibc bug -.UR https://sourceware.org/bugzilla/show_bug.cgi?id=16437 -.I #16437 -.UE , -and an incompatible extension to the standards; -however, as even a 32-bit -.I long -can hold the entire -.I tv_nsec -range, -it's always safe to forcibly down-cast it to the standard type.If the C standards and POSIX don't want to add a type for it, let us disagree with their decission.Let's not. This is valid /right now/ in no-flag (so "gnu18"?) Clang trunk and bullseye GCC: -- >8 -- $ cc -Wall -Wextra a.c $ cat a.c #include <time.h> static void nsecify(typeof((struct timespec){}.tv_nsec) * n) {
If I see such a function declarator, I'ma cry.
*n *= 2; } int main() { struct timespec q = {}; __auto_type w = &q.tv_nsec;
Please take off my eyes. :P I love auto, but it belongs to type-generic macros, IMO.
nsecify(w); } -- >8 -- And in C23 you'll be able to s/__auto_type/auto/.
In the end we got it! I hope GCC addresses this, cause auto still means the old thing even in gnu2x mode.
Let's add a bug: There's no portable way to declare to pointer to tv_nsec, since you never know for sure if it will be long* or llong*.Again, C23 has typeof() (kinda like decltype()), and on Clang trunk $ cc -Wall -Wextra a.c -std=c2x already compiles cleanly; the "portable way to declare a pointer to tv_nsec" is to spell it exactly as "i want a pointer to timespec::tv_nsec", which is even better than a single-use typedef.
You got me; it's portable. I'd port it to hell, but, it's portable.
Best, наб https://twitter.com/__phantomderp/status/1619027523257667584 (that's the C standard project editor shitposting; it's a glamorous age)
Oh, such a glorious age it is! :) It seems my shots at nullptr have failed :(
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3054.pdf already has typeof and https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3079.htm has the latest notes on auto, which n3091 marks as "Accepted with comment: wording from N3079 with editorial corrections."
Cheers, Alex -- <http://www.alejandro-colomar.es/>
Attachment:
OpenPGP_signature
Description: OpenPGP digital signature