Skip to content

Conversation

@frederick-vs-ja
Copy link
Contributor

Identifiers clang and noescape are not reserved by the C++ standard, so perhaps we need to use the equivalent reserved forms.

Also changes the occurrences of that attribute to a macro, following the convention for [[_Clang::__lifetimebound__]].

Addresses #91651 (comment).

@frederick-vs-ja frederick-vs-ja requested a review from a team as a code owner October 22, 2024 08:37
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Oct 22, 2024
@llvmbot
Copy link
Member

llvmbot commented Oct 22, 2024

@llvm/pr-subscribers-libcxx

Author: A. Jiang (frederick-vs-ja)

Changes

Identifiers clang and noescape are not reserved by the C++ standard, so perhaps we need to use the equivalent reserved forms.

Also changes the occurrences of that attribute to a macro, following the convention for [[_Clang::__lifetimebound__]].

Addresses #91651 (comment).


Full diff: https://github.com/llvm/llvm-project/pull/113280.diff

4 Files Affected:

  • (modified) libcxx/include/__charconv/from_chars_floating_point.h (+3-3)
  • (modified) libcxx/include/__config (+6)
  • (modified) libcxx/src/charconv.cpp (+3-3)
  • (modified) libcxx/test/libcxx/system_reserved_names.gen.py (+5)
diff --git a/libcxx/include/__charconv/from_chars_floating_point.h b/libcxx/include/__charconv/from_chars_floating_point.h index 2860b0e8da83af..5cd3fc4a41ea1d 100644 --- a/libcxx/include/__charconv/from_chars_floating_point.h +++ b/libcxx/include/__charconv/from_chars_floating_point.h @@ -37,13 +37,13 @@ struct __from_chars_result { template <class _Fp> _LIBCPP_EXPORTED_FROM_ABI __from_chars_result<_Fp> __from_chars_floating_point( - [[clang::noescape]] const char* __first, [[clang::noescape]] const char* __last, chars_format __fmt); + _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt); extern template __from_chars_result<float> __from_chars_floating_point( - [[clang::noescape]] const char* __first, [[clang::noescape]] const char* __last, chars_format __fmt); + _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt); extern template __from_chars_result<double> __from_chars_floating_point( - [[clang::noescape]] const char* __first, [[clang::noescape]] const char* __last, chars_format __fmt); + _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt); template <class _Fp> _LIBCPP_HIDE_FROM_ABI from_chars_result diff --git a/libcxx/include/__config b/libcxx/include/__config index fcba56f7e3d5b1..fca1a01851e81e 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -1167,6 +1167,12 @@ typedef __char32_t char32_t; # define _LIBCPP_LIFETIMEBOUND # endif +# if __has_cpp_attribute(_Clang::__noescape__) +# define _LIBCPP_NOESCAPE [[_Clang::__noescape__]] +# else +# define _LIBCPP_NOESCAPE +# endif + # if __has_attribute(__nodebug__) # define _LIBCPP_NODEBUG __attribute__((__nodebug__)) # else diff --git a/libcxx/src/charconv.cpp b/libcxx/src/charconv.cpp index 3fe0afec0e283c..5e8cb7d97703b4 100644 --- a/libcxx/src/charconv.cpp +++ b/libcxx/src/charconv.cpp @@ -77,13 +77,13 @@ to_chars_result to_chars(char* __first, char* __last, long double __value, chars template <class _Fp> __from_chars_result<_Fp> __from_chars_floating_point( - [[clang::noescape]] const char* __first, [[clang::noescape]] const char* __last, chars_format __fmt) { + _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt) { return std::__from_chars_floating_point_impl<_Fp>(__first, __last, __fmt); } template __from_chars_result<float> __from_chars_floating_point( - [[clang::noescape]] const char* __first, [[clang::noescape]] const char* __last, chars_format __fmt); + _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt); template __from_chars_result<double> __from_chars_floating_point( - [[clang::noescape]] const char* __first, [[clang::noescape]] const char* __last, chars_format __fmt); + _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt); _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/test/libcxx/system_reserved_names.gen.py b/libcxx/test/libcxx/system_reserved_names.gen.py index e29e7a2cdd6144..f3ded81cb0a2d6 100644 --- a/libcxx/test/libcxx/system_reserved_names.gen.py +++ b/libcxx/test/libcxx/system_reserved_names.gen.py @@ -154,6 +154,11 @@ #define Xp SYSTEM_RESERVED_NAME #define Xs SYSTEM_RESERVED_NAME +// These attribute-tokens are not reserved, so the user can macro-define them. +#define clang SYSTEM_RESERVED_NAME +#define lifetimebound SYSTEM_RESERVED_NAME +#define noescape SYSTEM_RESERVED_NAME + // The classic Windows min/max macros #define min SYSTEM_RESERVED_NAME #define max SYSTEM_RESERVED_NAME 
@frederick-vs-ja

This comment was marked as resolved.

Identifiers `clang` and `noescape` are not reserved by the C++ standard, so perhaps we need to use the equivalent reserved forms. Also changes the occurrences of that attribute to a macro, following the convention for `[[_Clang::__lifetimebound__]]`.
@ldionne
Copy link
Member

ldionne commented Oct 22, 2024

Oops... I must had ignored the following comments. @ldionne are you also working on such a macro? Perhaps this PR should be closed if so.

No, I don't have a patch yet. I just wanted to add documentation that can reference that macro.

@frederick-vs-ja frederick-vs-ja merged commit 08159e6 into llvm:main Oct 25, 2024
63 checks passed
@frederick-vs-ja frederick-vs-ja deleted the _Clang-__noescape__ branch October 25, 2024 01:04
@frobtech frobtech mentioned this pull request Oct 25, 2024
NoumanAmir657 pushed a commit to NoumanAmir657/llvm-project that referenced this pull request Nov 4, 2024
Identifiers `clang` and `noescape` are not reserved by the C++ standard, so perhaps we need to use the equivalent reserved forms. Also changes the occurrences of that attribute to a macro, following the convention for `[[_Clang::__lifetimebound__]]`. Addresses llvm#91651 (comment).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

4 participants