Paul Eggert wrote: > +#if (defined __STDC_VERSION__ && 199901L <= __STDC_VERSION__ \ > + && !defined __STDC_NO_VLA__) > +# define __ARG_NELTS(n) n > +#else > +# define __ARG_NELTS(n) > +#endif
I would suggest to add a condition __GNUC__ >= 11 in the #if. Rationale: GCC version 10 provides reasonable diagnostics with the __access__ attribute, but not with the VLA. ====================== foo.c ====================== int foo1 (int n, int a[]) __attribute__ ((__access__ (read_only, 2, 1))); int foo1 (int n, int a[]) { return a[0] + a[n-1]; } int foo2 (int n, int a[static n]); int foo2 (int n, int a[static n]) { return a[0] + a[n-1]; } void bar (int x) { int arr[4] = { 1, 2, 3, 4 }; foo1 (4, arr); foo1 (5, arr); foo2 (4, arr); foo2 (5, arr); } =================================================== $ gcc-version 10.3.0 -Wall -S foo.c foo.c: In function 'bar': foo.c:21:3: warning: 'foo1' reading 20 bytes from a region of size 16 [-Wstringop-overflow=] 21 | foo1 (5, arr); | ^~~~~~~~~~~~~ foo.c:5:5: note: in a call to function 'foo1' declared with attribute 'read_only (2, 1)' 5 | int foo1 (int n, int a[]) | ^~~~ $ gcc-version 11.2.0 -Wall -S foo.c foo.c: In function 'bar': foo.c:21:3: warning: 'foo1' reading 20 bytes from a region of size 16 [-Wstringop-overread] 21 | foo1 (5, arr); | ^~~~~~~~~~~~~ foo.c:19:7: note: source object 'arr' of size 16 19 | int arr[4] = { 1, 2, 3, 4 }; | ^~~ foo.c:5:5: note: in a call to function 'foo1' declared with attribute 'access (read_only, 2, 1)' 5 | int foo1 (int n, int a[]) | ^~~~ foo.c:23:3: warning: 'foo2' accessing 20 bytes in a region of size 16 [-Wstringop-overflow=] 23 | foo2 (5, arr); | ^~~~~~~~~~~~~ foo.c:23:3: note: referencing argument 2 of type 'int *' foo.c:12:5: note: in a call to function 'foo2' 12 | int foo2 (int n, int a[static n]) | ^~~~ Bruno