Skip to content

libc++ char_traits.h assumes EOF is always available #85158

Description

@petrhosek

libc++ assumes that EOF is always available and uses it unconditionally in the char_traits.h implementation.

In file included from /llvm_libcxx/include/chrono:830:                                                                                                                                                                                                                                                                                                                                 
In file included from /llvm_libcxx/include/__chrono/convert_to_tm.h:22:                                                                                                                                                                                                                                                                                                                
In file included from /llvm_libcxx/include/__chrono/statically_widen.h:17:                                                                                                                                                                                                                                                                                                             
In file included from /llvm_libcxx/include/__format/concepts.h:17:                                                                                                                                                                                                                                                                                                                     
In file included from /llvm_libcxx/include/__format/format_parse_context.h:16:                                                                                                                                                                                                                                                                                                         
In file included from /llvm_libcxx/include/string_view:225:                                                                                                                                                                                                                                                                                                                            
/llvm_libcxx/include/__string/char_traits.h:169:100: error: use of undeclared identifier 'EOF'                                                                                                                                                                                                                                                                                         
  169 |   static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return int_type(EOF); }                                                                                                                                                                                                                                                                                                                        
      |                                                                                                    ^                                                                                                                                                                                                                                                                                                                              
/llvm_libcxx/include/__string/char_traits.h:169:66: error: no return statement in constexpr function                                                                                                                                                                                                                                                                                   
  169 |   static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return int_type(EOF); }

LLVM libc doesn't currently define EOF on baremetal targets because there's no filesystem support (since baremetal targets typically don't have filesystem to begin with) which results in a compiler error.

We could extend LLVM libc to define EOF even on baremetal targets, but it's an open question whether libc++ should be able to handle the case where EOF is undefined.

This is related to issue #84879.

Metadata

Metadata

Assignees

No one assigned

    Labels

    embeddedSupport for embedded developmentlibc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.wontfixIssue is real, but we can't or won't fix it. Not invalid

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions