Hi,

Your optional patch looks on a quick scan ok to me. To be clear, you are 
proposing adding this to the llvm ports, to patch the version of the headers 
installed by that, right ?

Chris

> On 5 Jul 2020, at 6:33 am, Ken Cunningham <[email protected]> 
> wrote:
> 
> As software using c++17 is upon us, we have a slight problem with 
> std::optional.
> 
> clang has supported std::optional for some time, and clang-9.0, at least, 
> appears to support std::optional right back to the ancient systems.
> 
> however, there is one small part of std::optional, std::optional::value, that 
> needs a callback function in case of an exception being thrown, called 
> “bad_optional_access”. That symbol is compiled into libc++.dylib as of 10.13.
> 
> So clang-9.0 supports 99% of std::optional all the way back, but that 
> bad_optional_access function limits that one part of it, 
> std::optional::value, to 10.13. 
> 
> There are availability tests build into the libc++ headers based on system 
> version to turn that off.
> 
> However, on 10.6, where I build and install libc++ 5.0, that symbol exists in 
> libc++.dylib, so I disable clang’s availability tests.
> 
> It is quite simple (I think) to inline a function implementing 
> bad_optional_access into the <optional> header. That could be used for 10.7 
> to 10.12, and then all those systems could comfortably implement c++17, and 
> no problem. Otherwise we have to install a newer libc++.dylib on older 
> systems, which is a simple but big problem, as it were.
> 
> Here’s the <optional> patch. I only speak basic c++, so improve this if you 
> can.
> 
> So I am proposing to use this patch, and disable Apple’s availability test in 
> <__config> for bad_optional_access.
> 
> Then all systems from 10.5 to current can use c++17 std::optional, and 
> disaster averted until the next crisis.
> 
> Warts?
> 
> Ken
> 
> 
> <optional> patch:
> 
> 
> $ diff -u optional.orig optional
> --- optional.orig     2020-07-04 18:51:05.000000000 -0700
> +++ optional  2020-07-04 18:51:13.000000000 -0700
> @@ -168,13 +168,10 @@
>  namespace std  // purposefully not using versioning namespace
>  {
>  
> -class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS 
> bad_optional_access
> -    : public exception
> -{
> +// 20.5.8, class bad_optional_access
> +class bad_optional_access : public logic_error {
>  public:
> -    // Get the key function ~bad_optional_access() into the dylib
> -    virtual ~bad_optional_access() _NOEXCEPT;
> -    virtual const char* what() const _NOEXCEPT;
> +  explicit bad_optional_access() : logic_error{"bad optional access"} {}
>  };
>  
>  }  // std
> 

Reply via email to