From: Alejandro Colomar <alx.manpages@gmail.com>
To: Martin Uecker <uecker@tugraz.at>, Joseph Myers <joseph@codesourcery.com>
Cc: Ingo Schwarze <schwarze@usta.de>,
JeanHeyd Meneide <wg14@soasis.org>,
linux-man@vger.kernel.org, gcc@gcc.gnu.org
Subject: Re: [PATCH] Various pages: SYNOPSIS: Use VLA syntax in function parameters
Date: Sun, 13 Nov 2022 17:34:07 +0100 [thread overview]
Message-ID: <d0fed7ea-a60e-7524-a05c-679b77570dcb@gmail.com> (raw)
In-Reply-To: <786bdaaf-cfa1-e26a-f14f-a6d4bc71b5bd@gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 4893 bytes --]
On 11/13/22 17:31, Alejandro Colomar wrote:
>
>
> On 11/13/22 17:28, Alejandro Colomar wrote:
>> SYNOPSIS:
>>
>> unary-operator: . identifier
>>
>>
>> DESCRIPTION:
>>
>> - It is not an lvalue.
>>
>> - This means sizeof() and _Lengthof() cannot be applied to them.
>
> Sorry, the above is a thinko.
>
> I wanted to say that, like sizeof() and _Lengthof(), you can't assign to it.
>
>> - This prevents ambiguity with a designator in an initializer-list within
>> a nested braced-initializer.
>>
>> - The type of a .identifier is always an incomplete type.
Or rather, more easily prohibit explicitly using typeof(), sizeof(), and
_Lengthof() to it.
>>
>> - This prevents circular dependencies involving sizeof() or _Lengthof().
>>
>> - Shadowing rules apply.
>>
>> - This prevents ambiguity.
>>
>>
>> EXAMPLES:
>>
>>
>> - Valid examples (libc):
>>
>> int
>> strncmp(const char s1[.n],
>> const char s2[.n],
>> size_t n);
>>
>> int
>> cacheflush(void addr[.nbytes],
>> int nbytes,
>> int cache);
>>
>> long
>> mbind(void addr[.len],
>> unsigned long len,
>> int mode,
>> const unsigned long nodemask[(.maxnode + ULONG_WIDTH ‐ 1)
>> / ULONG_WIDTH],
>> unsigned long maxnode, unsigned int flags);
>>
>> void *
>> bsearch(const void key[.size],
>> const void base[.size * .nmemb],
>> size_t nmemb,
>> size_t size,
>> int (*compar)(const void [.size], const void [.size]));
>>
>> - Valid examples (my own):
>>
>> void
>> ustr2str(char dst[restrict .len + 1],
>> const char src[restrict .len],
>> size_t len);
>>
>> char *
>> stpecpy(char dst[.end - .dst + 1],
>> char *restrict src,
>> char end[1]);
>>
>> - Valid examples (from this thread):
>>
>> -
>> struct s { int a; };
>> void f(int a, int b[((struct s) { .a = 1 }).a]);
>>
>> Explanation:
>> - Because of shadowing rules, .a=1 refers to the struct member.
>> - Also, if .a referred to the parameter, it would be an rvalue, so
>> it wouldn't be valid to assign to it.
>> - (...).a refers to the struct member too, since otherwise an rvalue
>> is not expected there.
>>
>> -
>> void foo(struct bar { int x; char c[.x] } a, int x);
>>
>> Explanation:
>> - Because of shadowing rules, [.x] refers to the struct member.
>>
>> -
>> struct bar { int y; };
>> void foo(char p[((struct bar){ .y = .x }).y], int x);
>>
>> Explanation:
>> - .x unambiguously refers to the parameter.
>>
>> - Undefined behavior:
>>
>> -
>> struct bar { int y; };
>> void foo(char p[((struct bar){ .y = .y }).y], int y);
>>
>> Explanation:
>> - Because of shadowing rules, =.y refers to the struct member.
>> - .y=.y means initialize the member with itself (uninitialized use).
>> - (...).y refers to the struct member, since otherwise an rvalue is
>> not expected there.
>>
>> - Constraint violations:
>>
>> -
>> void foo(char (*a)[sizeof *.b], char (*b)[sizeof *.a]);
>>
>> Explanation:
>> - sizeof(*.b): Cannot get size of incomplete type.
>> - sizeof(*.a): Cannot get size of incomplete type.
>>
>> -
>> void f(size_t s, int a[sizeof(1) = 1]);
>>
>> Explanation:
>> - Cannot assign to rvalue.
>>
>> -
>> void f(size_t s, int a[.s = 1]);
>>
>> Explanation:
>> - Cannot assign to rvalue.
>>
>> -
>> void f(size_t s, int a[sizeof(.s)]);
>>
>> Explanation:
>> - sizeof(.s): Cannot get size of incomplete type.
>>
>>
>> Does this idea make sense to you?
>>
>>
>> Cheers,
>> Alex
>
--
<http://www.alejandro-colomar.es/>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2022-11-13 16:34 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20220826210710.35237-1-alx.manpages@gmail.com>
[not found] ` <Ywn7jMtB5ppSW0PB@asta-kit.de>
[not found] ` <89d79095-d1cd-ab2b-00e4-caa31126751e@gmail.com>
[not found] ` <YwoXTGD8ljB8Gg6s@asta-kit.de>
[not found] ` <e29de088-ae10-bbc8-0bfd-90bbb63aaf06@gmail.com>
[not found] ` <5ba53bad-019e-8a94-d61e-85b2f13223a9@gmail.com>
[not found] ` <CACqA6+mfaj6Viw+LVOG=nE350gQhCwVKXRzycVru5Oi4EJzgTg@mail.gmail.com>
[not found] ` <491a930d-47eb-7c86-c0c4-25eef4ac0be0@gmail.com>
2022-09-02 21:57 ` Alejandro Colomar
2022-09-03 12:47 ` Martin Uecker
2022-09-03 13:29 ` Ingo Schwarze
2022-09-03 15:08 ` Alejandro Colomar
2022-09-03 13:41 ` Alejandro Colomar
2022-09-03 14:35 ` Martin Uecker
2022-09-03 14:59 ` Alejandro Colomar
2022-09-03 15:31 ` Martin Uecker
2022-09-03 20:02 ` Alejandro Colomar
2022-09-05 14:31 ` Alejandro Colomar
2022-11-10 0:06 ` Alejandro Colomar
2022-11-10 0:09 ` Alejandro Colomar
2022-11-10 1:33 ` Joseph Myers
2022-11-10 1:39 ` Joseph Myers
2022-11-10 6:21 ` Martin Uecker
2022-11-10 10:09 ` Alejandro Colomar
2022-11-10 23:19 ` Joseph Myers
2022-11-10 23:28 ` Alejandro Colomar
2022-11-11 19:52 ` Martin Uecker
2022-11-12 1:09 ` Joseph Myers
2022-11-12 7:24 ` Martin Uecker
2022-11-12 12:34 ` Alejandro Colomar
2022-11-12 12:46 ` Alejandro Colomar
2022-11-12 13:03 ` Joseph Myers
2022-11-12 13:40 ` Alejandro Colomar
2022-11-12 13:58 ` Alejandro Colomar
2022-11-12 14:54 ` Joseph Myers
2022-11-12 15:35 ` Alejandro Colomar
2022-11-12 17:02 ` Joseph Myers
2022-11-12 17:08 ` Alejandro Colomar
2022-11-12 15:56 ` Martin Uecker
2022-11-13 13:19 ` Alejandro Colomar
2022-11-13 13:33 ` Alejandro Colomar
2022-11-13 14:02 ` Alejandro Colomar
2022-11-13 14:58 ` Martin Uecker
2022-11-13 15:15 ` Alejandro Colomar
2022-11-13 15:32 ` Martin Uecker
2022-11-13 16:25 ` Alejandro Colomar
2022-11-13 16:28 ` Alejandro Colomar
2022-11-13 16:31 ` Alejandro Colomar
2022-11-13 16:34 ` Alejandro Colomar [this message]
2022-11-13 16:56 ` Alejandro Colomar
2022-11-13 19:05 ` Alejandro Colomar
2022-11-14 18:13 ` Joseph Myers
2022-11-28 22:59 ` Alex Colomar
2022-11-28 23:18 ` Alex Colomar
2022-11-29 0:05 ` Joseph Myers
2022-11-29 14:58 ` Michael Matz
2022-11-29 15:17 ` Uecker, Martin
2022-11-29 15:44 ` Michael Matz
2022-11-29 16:58 ` Uecker, Martin
2022-11-29 17:28 ` Alex Colomar
2022-11-29 16:49 ` Joseph Myers
2022-11-29 16:53 ` Jonathan Wakely
2022-11-29 17:00 ` Martin Uecker
2022-11-29 17:19 ` Alex Colomar
2022-11-29 17:29 ` Alex Colomar
2022-12-03 21:03 ` Alejandro Colomar
2022-12-03 21:13 ` Andrew Pinski
2022-12-03 21:15 ` Martin Uecker
2022-12-03 21:18 ` Alejandro Colomar
2022-12-06 2:08 ` Joseph Myers
2022-11-14 17:52 ` Joseph Myers
2022-11-14 17:57 ` Alejandro Colomar
2022-11-14 18:26 ` Joseph Myers
2022-11-28 23:02 ` Alex Colomar
2022-11-10 9:40 ` G. Branden Robinson
2022-11-10 10:59 ` Alejandro Colomar
2022-11-10 22:25 ` G. Branden Robinson
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=d0fed7ea-a60e-7524-a05c-679b77570dcb@gmail.com \
--to=alx.manpages@gmail.com \
--cc=gcc@gcc.gnu.org \
--cc=joseph@codesourcery.com \
--cc=linux-man@vger.kernel.org \
--cc=schwarze@usta.de \
--cc=uecker@tugraz.at \
--cc=wg14@soasis.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).