jhuber6 added a comment.

For reference, here is what one of the newly generated headers looks like that 
is used.

  #ifndef __LLVM_LIBC_DECLARATIONS_STDIO_H
  #define __LLVM_LIBC_DECLARATIONS_STDIO_H
  
  #ifndef __LIBC_ATTRS
  #define __LIBC_ATTRS
  #endif
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  int puts(const char *__restrict) __LIBC_ATTRS;
  
  int fputs(const char *__restrict, FILE *__restrict) __LIBC_ATTRS;
  
  extern FILE * stdin __LIBC_ATTRS;
  extern FILE * stdout __LIBC_ATTRS;
  extern FILE * stderr __LIBC_ATTRS;
  
  #ifdef __cplusplus
  }
  #endif

Unfortunately I have already run into a few problems with the re-declarations 
given the GNU `libc` headers. Here is the error message when including 
`string.h` now,

  
/home/jhuber/Documents/llvm/clang/lib/clang/17/include/llvm_libc_wrappers/llvm-libc-decls/string.h:54:8:
 error: 'strstr' is missing exception specification 'noexcept(true)'
     54 | char * strstr(const char *, const char *) __LIBC_ATTRS;
        |        ^
  /usr/include/string.h:343:1: note: previous declaration is here
    343 | strstr (const char *__haystack, const char *__needle) __THROW
        | ^
  5 errors generated.

This occurs for `memchr`, `strchr`, `strpbrk`, `strchr`, and `strstr`. If you 
define `__LIBC_ATTRS` to the `noexcept(true)` you get a different error,

  
/home/jhuber/Documents/llvm/clang/lib/clang/17/include/llvm_libc_wrappers/llvm-libc-decls/string.h:54:8:
 error: functions that differ only in their return type cannot be overloaded
     54 | char * strstr(const char *, const char *) __LIBC_ATTRS;
        | ~~~~~~ ^
  /usr/include/string.h:343:1: note: previous definition is here
    343 | __extern_always_inline const char *
        |                              ~~~~~~
    344 | strstr (const char *__haystack, const char *__needle) __THROW
        | ^

Looking at the definitions, they look like this in the GNU headers,

  extern char *strstr (char *__haystack, const char *__needle)    
       __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2));    
  extern const char *strstr (const char *__haystack, const char *__needle)    
       __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2));

Does anyone have any suggestions on working around this? The other supported 
headers work as far as I can tell.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D154036/new/

https://reviews.llvm.org/D154036

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to