[C2hs] Syntax error with __restrict symbol in regex.h

Manuel M T Chakravarty chak at cse.unsw.edu.au
Fri Apr 28 20:26:54 EDT 2006


Thanks for the report.  One more gcc extension we need to cover.

Cheers,
Manuel

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



More information about the C2hs mailing list