public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/108269] New: Incorrect __PRETTY_FUNCTION__ with std::array<char> in C++20 NTTP literal @ 2023-01-02 21:43 camden.mannett at gmail dot com 2023-01-03 1:16 ` [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal intiailization containing a char array is assumed to ending in a null character pinskia at gcc dot gnu.org ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: camden.mannett at gmail dot com @ 2023-01-02 21:43 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108269 Bug ID: 108269 Summary: Incorrect __PRETTY_FUNCTION__ with std::array<char> in C++20 NTTP literal Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: camden.mannett at gmail dot com Target Milestone: --- Created attachment 54176 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54176&action=edit Source code When std::array<char, N> is used within a literal type that is used as an NTTP, it _looks_ like the __PRETTY_FUNCTION__ output always assumes that it is a null-terminated string which is then displayed without the last character - but it is not always a null! It is simplest to demonstrate with a compile-time string implementation (https://godbolt.org/z/8EnPfeWq7): #include <algorithm> #include <array> #include <iostream> namespace { template<typename T> class type_string_t { [[nodiscard]] constexpr static std::string_view generate() noexcept { constexpr auto sig = std::string_view{ static_cast<const char*>(__PRETTY_FUNCTION__) }; return sig; } public: constexpr static auto value = generate(); }; template<typename T> constexpr auto type_string = type_string_t<T>::value; template<std::size_t N> class str_storage { public: constexpr str_storage(const char (&str)[N]) { std::copy_n(&str[0], N, value.begin()); } constexpr str_storage(char c) : value{ c } { } std::array<char, N> value; }; str_storage(char) -> str_storage<1>; template<str_storage S> struct str {}; } int main() { std::cout << type_string<str<'a'>> << "\n" << type_string<str<"a">> << "\n" << type_string<str<"hello">> << std::endl; return 0; } This yields pretty much what you would expect when built via Clang (after removal of cruft): (anonymous namespace)::str<{{{97}}}> (anonymous namespace)::str<{{"a"}}> (anonymous namespace)::str<{{"hello"}}> However gcc does something different when the std::array contains only a single char: {anonymous}::str<{anonymous}::str_storage<1>{std::array<char, 1>{""}}> {anonymous}::str<{anonymous}::str_storage<2>{std::array<char, 2>{"a"}}> {anonymous}::str<{anonymous}::str_storage<6>{std::array<char, 6>{"hello"}}> It seems to always represent the char array as a null-terminated string literal, which isn't always true. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal intiailization containing a char array is assumed to ending in a null character 2023-01-02 21:43 [Bug c++/108269] New: Incorrect __PRETTY_FUNCTION__ with std::array<char> in C++20 NTTP literal camden.mannett at gmail dot com @ 2023-01-03 1:16 ` pinskia at gcc dot gnu.org 2023-01-03 1:18 ` pinskia at gcc dot gnu.org ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2023-01-03 1:16 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108269 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2023-01-03 Ever confirmed|0 |1 Summary|Incorrect |__PRETTY_FUNCTION__ for |__PRETTY_FUNCTION__ with |NTTP literal intiailization |std::array<char> in C++20 |containing a char array is |NTTP literal |assumed to ending in a null | |character --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- type_string<str<"hello\0\1">> Works though: static constexpr std::string_view {anonymous}::type_string_t<T>::generate() [with T = {anonymous}::str<{anonymous}::str_storage<8>{std::array<char, 8>{"hello\000\001"}}>; std::string_view = std::basic_string_view<char>] .... Oh the problem is just char ending not in a null character. Reduced testcase: template<auto b> struct type_string_t { constexpr static auto generate() noexcept { return __PRETTY_FUNCTION__; } }; template<int N> struct t { char a[N]; }; int main() { __builtin_printf("%s\n", type_string_t<t{{'a', 'b'}}>::generate()); return 0; } ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal intiailization containing a char array is assumed to ending in a null character 2023-01-02 21:43 [Bug c++/108269] New: Incorrect __PRETTY_FUNCTION__ with std::array<char> in C++20 NTTP literal camden.mannett at gmail dot com 2023-01-03 1:16 ` [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal intiailization containing a char array is assumed to ending in a null character pinskia at gcc dot gnu.org @ 2023-01-03 1:18 ` pinskia at gcc dot gnu.org 2023-01-03 1:20 ` pinskia at gcc dot gnu.org 2023-01-03 14:19 ` [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal initialization " camden.mannett at gmail dot com 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2023-01-03 1:18 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108269 --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Note this is just a problem with __PRETTY_FUNCTION__/__func__ and not an ABI issue as it is done correctly for the mangling. So it is just a minor issue dealing with debugging really because __PRETTY_FUNCTION__/__func__ format does not have any standard way of describing what it is. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal intiailization containing a char array is assumed to ending in a null character 2023-01-02 21:43 [Bug c++/108269] New: Incorrect __PRETTY_FUNCTION__ with std::array<char> in C++20 NTTP literal camden.mannett at gmail dot com 2023-01-03 1:16 ` [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal intiailization containing a char array is assumed to ending in a null character pinskia at gcc dot gnu.org 2023-01-03 1:18 ` pinskia at gcc dot gnu.org @ 2023-01-03 1:20 ` pinskia at gcc dot gnu.org 2023-01-03 14:19 ` [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal initialization " camden.mannett at gmail dot com 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2023-01-03 1:20 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108269 --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- __PRETTY_FUNCTION__ is also a GCC extension too so ... ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal initialization containing a char array is assumed to ending in a null character 2023-01-02 21:43 [Bug c++/108269] New: Incorrect __PRETTY_FUNCTION__ with std::array<char> in C++20 NTTP literal camden.mannett at gmail dot com ` (2 preceding siblings ...) 2023-01-03 1:20 ` pinskia at gcc dot gnu.org @ 2023-01-03 14:19 ` camden.mannett at gmail dot com 3 siblings, 0 replies; 5+ messages in thread From: camden.mannett at gmail dot com @ 2023-01-03 14:19 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108269 --- Comment #4 from Camden Mannett <camden.mannett at gmail dot com> --- > So it is just a minor issue dealing with debugging really ... __PRETTY_FUNCTION__ is (mis)used for more than that though; it's often used as an compile-time version of RTTI: https://stackoverflow.com/questions/281818/unmangling-the-result-of-stdtype-infoname/66551751#66551751 There's a whole library based around the concept: https://github.com/Manu343726/ctti ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-01-03 14:19 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-01-02 21:43 [Bug c++/108269] New: Incorrect __PRETTY_FUNCTION__ with std::array<char> in C++20 NTTP literal camden.mannett at gmail dot com 2023-01-03 1:16 ` [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal intiailization containing a char array is assumed to ending in a null character pinskia at gcc dot gnu.org 2023-01-03 1:18 ` pinskia at gcc dot gnu.org 2023-01-03 1:20 ` pinskia at gcc dot gnu.org 2023-01-03 14:19 ` [Bug c++/108269] __PRETTY_FUNCTION__ for NTTP literal initialization " camden.mannett at gmail dot com
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).