[C2hs] Syntax error with __restrict symbol in regex.h
Duncan Coutts
duncan.coutts at worc.ox.ac.uk
Sat Apr 29 10:40:14 EDT 2006
On Fri, 2006-04-28 at 20:26 -0400, Manuel M T Chakravarty wrote:
> Thanks for the report. One more gcc extension we need to cover.
We do have some support for restrict/__restrict but it obviously didn't
cover this case. The restrict keyword is in C99 I believe so it's no
longer just a 'gcc'ism.
>From a quick glance over the grammar I couldn't obviously see why it
wasn't parsing this example.
Duncan
> Will Thompson:
> > Ahoy,
> >
> > I am writing bindings for a library which includes regex.h from libc6
> > (version 2.6.3-3 in Debian). c2hs 0.14.5 refuses to parse regex.h as
> > follows:
> >
> > % c2hs Regex.chs
> > c2hs: Error in C header file.
> >
> > /usr/include/regex.h:570: (column 125) [FATAL]
> > >>> Syntax error!
> > The symbol `restrict' does not fit here.
> >
> > where Regex.chs contains:
> >
> > module Regex
> > where
> > #include <regex.h>
> >
> > The offending section of regex.h is:
> >
> > /* GCC 2.95 and later have "__restrict"; C99 compilers have
> > "restrict", and "configure" may have defined "restrict". */
> > #ifndef __restrict
> > # if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
> > # if defined restrict || 199901L <= __STDC_VERSION__
> > # define __restrict restrict
> > # else
> > # define __restrict
> > # endif
> > # endif
> > #endif
> > /* gcc 3.1 and up support the [restrict] syntax. */
> > #ifndef __restrict_arr
> > # if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
> > # define __restrict_arr __restrict
> > # else
> > # define __restrict_arr
> > # endif
> > #endif
> >
> > /* POSIX compatibility. */
> > extern int regcomp _RE_ARGS ((regex_t *__restrict __preg,
> > const char *__restrict __pattern,
> > int __cflags));
> >
> > extern int regexec _RE_ARGS ((const regex_t *__restrict __preg,
> > const char *__restrict __string, size_t __nmatch,
> > regmatch_t __pmatch[__restrict_arr],
> > int __eflags));
> >
> > which, according to c2hs -k, is transformed by cpp on my system to:
> >
> > # 566 "/usr/include/regex.h" 3 4
> > extern int regcomp (regex_t *__restrict __preg, const char *__restrict __pattern, int __cflags);
> >
> >
> >
> > extern int regexec (const regex_t *__restrict __preg, const char *__restrict __string, size_t __nmatch, regmatch_t __pmatch[__restrict], int __eflags);
> >
> > `c2hs --cppopts="-D__restrict=" ...` works around the problem, so this
> > is irritating rather than a showstopper. I spoke to Duncan about this on
> > IRC yesterday: this is still present with 0.14.5:
> >
> > % c2hs --version
> > C->Haskell Compiler, version 0.14.5 Travelling Lightly, 12 Dec 2005
> > build platform is "i686-pc-linux-gnu" <1, True, True, 1>
> >
> > If I can provide any more information, let me know.
> >
> > Will
> > _______________________________________________
> > C2hs mailing list
> > C2hs at haskell.org
> > http://www.haskell.org/mailman/listinfo/c2hs
>
> _______________________________________________
> C2hs mailing list
> C2hs at haskell.org
> http://www.haskell.org/mailman/listinfo/c2hs
More information about the C2hs
mailing list