svn commit: r287206 - head/sys/sys

Pedro Giffuni pfg at FreeBSD.org
Thu Aug 27 21:16:01 UTC 2015



On 08/27/15 12:41, Alexander Kabaev wrote:
...

> The existing conditional is not working for lint and I had to shuffle it
> under bigger
> '#ifdef lint' protection.

And other BSDs are just getting rid of lint. I have no opinion on that
though.

>  ... Nor is the condition even well formed enough
> to work with any
> recent GCC and using __has_attribute in naked form is a mistake:
>
> % cat t.c
> #if __has_attribute(alloc_size)
> # error Has attribute
> #endif
>

We are not really using __has_attribute() in it's naked form: we are
following the official clang procedure:

http://clang.llvm.org/docs/LanguageExtensions.html#feature-checking-macros

In cdefs.h that corresponds to lines 42-44.

...

> % mips-portbld-freebsd11.0-gcc --version
> mips-portbld-freebsd11.0-gcc (FreeBSD Ports Collection for mips) 5.2.0
> Copyright (C) 2015 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions.  There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
>
> % mips-portbld-freebsd11.0-gcc -E t.c
> # 1 "t.c"
> # 1 "<built-in>"
> # 1 "<command-line>"
> # 1 "t.c"
> t.c:2:3: error: #error Has attribute
>   # error Has attribute
>     ^
>
> % gcc48 --version
> gcc48 (FreeBSD Ports Collection) 4.8.5
> Copyright (C) 2015 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions.  There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
>
> % gcc48 -E t.c
> # 1 "t.c"
> # 1 "<built-in>"
> # 1 "<command-line>"
> # 1 "t.c"
> t.c:1:20: error: missing binary operator before token "("
>   #if __has_attribute(alloc_size)
>
>         Modified:
>             head/sys/sys/cdefs.h
>
>     ..
>
>
>            #if !__GNUC_PREREQ__(2, 95)
>         @@ -371,24 +382,12 @@
>            #define       __returns_twice
>            #endif
>
>         -#if __has_attribute(alloc_size) || __GNUC_PREREQ__(4, 3)
>         -#define        __alloc_size(x) __attribute__((__alloc_size__(x)))
>         -#else
>         -#define        __alloc_size(x)
>         -#endif
>         -
>
>
>     This surely got through in GCC's case through the __GNUC_PREREQ__.
>     Of course gcc 4.2 has neither attribute but clang has alloc_size
>     so I wonder why it hasn't affected the lint builds.
>
>     Just curiosity, the change is OK but it will be getting ugly if we
>     have to add all the new attributes in the !lint section.
>
>     Regards,
>
>     Pedro.
>
>
> clang in tree does not have the slightest idea about the alloc_size
> attribute, and that is why it worked, as demonstrated by the test below:
>

Ugh yes, it appears it's unsupported still. I though I had seen a bug 
report with a patch but I can't find it anymore. Grepping it in contrib
doesn't show anything.

...

> The original change to cdefs.h appears to be plain wrong.
>

Not really, it may appear some day.

Pedro.


More information about the svn-src-head mailing list