[libc-commits] [libc] [libcxx] [llvm] [libcxx][libc] Hand in Hand PoC with from_chars (PR #91651)

Louis Dionne via libc-commits libc-commits at lists.llvm.org
Wed Sep 25 09:28:37 PDT 2024


================
@@ -0,0 +1,56 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___CHARCONV_FROM_CHARS_FLOATING_POINT_H
+#define _LIBCPP___CHARCONV_FROM_CHARS_FLOATING_POINT_H
+
+#include <__assert>
+#include <__charconv/chars_format.h>
+#include <__charconv/from_chars_result.h>
+#include <__charconv/traits.h>
+#include <__config>
+#include <__system_error/errc.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/is_floating_point.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_PUSH_MACROS
+#include <__undef_macros>
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#if _LIBCPP_STD_VER >= 17
+
+_LIBCPP_EXPORTED_FROM_ABI from_chars_result
+__from_chars_floating_point(const char* __first, const char* __last, float& __value, chars_format __fmt);
----------------
ldionne wrote:

Just to be sure I understand, what you're suggesting is this, right?

```
pair<offset, error_code> __from_chars_floating_point([[clang::noescape]] char const* __first,
                              [[clang::noescape]] char const* __last,
                              float& /* maybe noescape? */ __value, chars_format __fmt);
```

And the benefit of doing this is that the compiler can now make better alias analysis, which it can't otherwise do because it cannot inline the function.

If we don't have `noescape`, am I right in thinking that the compiler might have to reload any other pointer in scope because `__first` could point to arbitrary objects, since it's a `char` pointer.

https://github.com/llvm/llvm-project/pull/91651


More information about the libc-commits mailing list