On Fri, Jan 16, 2004 at 05:23:01PM -0800, Tim Kientzle wrote:
> I've been enabling a LOT of gcc warnings recently
> in the process of linting some code I'm writing.
> In the process, I stumbled across the following
> curiosity:
> 
> > cat test.c
> #include <stdio.h>
> > gcc -std=c99 -ansi test.c
> In file included from test.c:1:
> /usr/include/stdio.h:220: conflicting types for `restrict'
> /usr/include/stdio.h:220: previous declaration of `restrict'
> /usr/include/stdio.h:221: conflicting types for `restrict'
> /usr/include/stdio.h:221: previous declaration of `restrict'
> /usr/include/stdio.h:222: redefinition of `restrict'
> /usr/include/stdio.h:222: `restrict' previously declared here
> /usr/include/stdio.h:223: conflicting types for `restrict'
> [ .... many similar lines omitted .... ]
> 
> If I change all "__restrict" in stdio.h to "__restrict__",
> these warnings disappear.
> 
> Question:  Does anyone know the difference between
> __restrict and __restrict__?
> 
__restrict__ is the gcc(1)-only feature.  From gcc.info:

: `-std='
:      Determine the language standard.  This option is currently only
:      supported when compiling C or C++.  A value for this option must be
:      provided; possible values are
: [...]
:      Even when this option is not specified, you can still use some of
:      the features of newer standards in so far as they do not conflict
:      with previous C standards.  For example, you may use
:      `__restrict__' even when `-std=c99' is not specified.
: [...]
: As with gcc, g++ understands the C99 feature of restricted pointers,
: specified with the `__restrict__', or `__restrict' type qualifier.
: Because you cannot compile C++ by specifying the `-std=c99' language
: flag, `restrict' is not a keyword in C++.

__restrict is defined in <sys/cdefs.h>, it's the FreeBSD feature.

> Should we be using the latter in our system headers?
> 
No, we should be using the __restrict as coded.  But I wonder why
we can't just use "restrict", please see below.

Note that __restrict is a no-op these days because we don't
compile our C code by default with -std=c99.

I'm not sure why we can't replace

#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95)
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901
#define __restrict
#else
#define __restrict      restrict
#endif
#endif

with

#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901
#define restrict
#endif

and just use "restrict" everywhere.  Also similarly I'm not
aware of the status of the CSTD feature for share/mk that
was backed out.  (8 makefiles in src/ still have CSTD.)


Cheers,
-- 
Ruslan Ermilov
FreeBSD committer
[EMAIL PROTECTED]

Attachment: pgp00000.pgp
Description: PGP signature

Reply via email to