Skip to content

fix: switch to std::nullptr_t, add release-mode defined behavior#4

Merged
dascandy merged 2 commits into
mainfrom
fix-final-errors
Aug 20, 2025
Merged

fix: switch to std::nullptr_t, add release-mode defined behavior#4
dascandy merged 2 commits into
mainfrom
fix-final-errors

Conversation

@dascandy
Copy link
Copy Markdown
Collaborator

Description

Add workaround for LLVM bug llvm/llvm-project#154577 . Add return statement in function that otherwise in release mode has a path that does not return.

Related Issues

Motivation and Context

Fixing the main builds

Testing

Running the main builds on Clang/LLVM.

Meta

  • If all approvals are obtained and the PR is green, any Beman member can merge the PR.

@dascandy dascandy requested a review from neatudarius as a code owner August 20, 2025 17:25
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[pre-commit] reported by reviewdog 🐶

template<class charT, class traits /* = char_traits<charT> */>
class basic_cstring_view {
public:
// types
using traits_type = traits;
using value_type = charT;
using pointer = value_type*;
using const_pointer = const value_type*;
using reference = value_type&;
using const_reference = const value_type&;
using const_iterator = const charT*; // see [cstring.view.iterators]
using iterator = const_iterator;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
using reverse_iterator = const_reverse_iterator;
using size_type = size_t;
using difference_type = ptrdiff_t;
static constexpr size_type npos = size_type(-1);
// [cstring.view.cons], construction and assignment
constexpr basic_cstring_view() noexcept : size_() {
static const charT empty_string[1]{};
data_ = std::data(empty_string);
}
constexpr basic_cstring_view(const basic_cstring_view&) noexcept = default;
constexpr basic_cstring_view& operator=(const basic_cstring_view&) noexcept = default;
constexpr basic_cstring_view(const charT* str) : basic_cstring_view(str, traits::length(str)) {}
constexpr basic_cstring_view(const charT* str, size_type len) : data_(str), size_(len) {
assert(str[len] == charT());
}
// https://github.com/llvm/llvm-project/issues/154577
// constexpr basic_cstring_view(nullptr_t) = delete;
constexpr basic_cstring_view(decltype(nullptr)) = delete;
// NOTE: Not part of proposal, just to make examples work since I can't add the conversion operator to
// basic_string.
template<typename Traits, typename Allocator>
constexpr basic_cstring_view(const std::basic_string<charT, Traits, Allocator>& str)
: basic_cstring_view(str.c_str(), str.size()) {}
// [cstring.view.iterators], iterator support
constexpr const_iterator begin() const noexcept {
return data_;
}
constexpr const_iterator end() const noexcept {
return data_ + size_;
}
constexpr const_iterator cbegin() const noexcept {
return begin();
}
constexpr const_iterator cend() const noexcept {
return end();
}
constexpr const_reverse_iterator rbegin() const noexcept {
return data_ + size_;
}
constexpr const_reverse_iterator rend() const noexcept {
return data_;
}
constexpr const_reverse_iterator crbegin() const noexcept {
return rbegin();
}
constexpr const_reverse_iterator crend() const noexcept {
return rend();
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... what?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[pre-commit] reported by reviewdog 🐶

// [cstring.view.template], class template basic_cstring_view
template<class charT, class traits = std::char_traits<charT>>
class basic_cstring_view; // partially freestanding
/*
#if __cpp_lib_ranges >= 201911L
namespace ranges {
template<class charT, class traits>
constexpr bool enable_view<basic_cstring_view<charT, traits>> = true;
template<class charT, class traits>
constexpr bool enable_borrowed_range<basic_cstring_view<charT, traits>> = true;
}
#endif
*/
// [cstring.view.comparison], non-member comparison functions
template<class charT, class traits>
constexpr bool operator==(
basic_cstring_view<charT, traits> x,
std::type_identity_t<basic_cstring_view<charT, traits>> y
) noexcept;
template<class charT, class traits>
constexpr auto operator<=>(
basic_cstring_view<charT, traits> x,
std::type_identity_t<basic_cstring_view<charT, traits>> y
) noexcept;
// [cstring.view.io], inserters and extractors
template<class charT, class traits>
std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, basic_cstring_view<charT, traits> str);
// basic_cstring_view typedef-names
using cstring_view = basic_cstring_view<char>;
using u8cstring_view = basic_cstring_view<char8_t>;
using u16cstring_view = basic_cstring_view<char16_t>;
using u32cstring_view = basic_cstring_view<char32_t>;
using wcstring_view = basic_cstring_view<wchar_t>;
// [cstring.view.hash], hash support
template<class T> struct hash;
template<> struct hash<cstring_view>;
template<> struct hash<u8cstring_view>;
template<> struct hash<u16cstring_view>;
template<> struct hash<u32cstring_view>;
template<> struct hash<wcstring_view>;
inline namespace literals {
inline namespace cstring_view_literals {
#ifndef _MSC_VER
#pragma GCC diagnostic push
#ifdef __clang__
#pragma GCC diagnostic ignored "-Wuser-defined-literals"
#else
#pragma GCC diagnostic ignored "-Wliteral-suffix"
#endif
#else
#pragma warning(push)
#pragma warning(disable: 4455)
#endif
// [cstring.view.literals], suffix for basic_cstring_view literals
constexpr cstring_view operator"" csv(const char* str, size_t len) noexcept;
constexpr u8cstring_view operator"" csv(const char8_t* str, size_t len) noexcept;
constexpr u16cstring_view operator"" csv(const char16_t* str, size_t len) noexcept;
constexpr u32cstring_view operator"" csv(const char32_t* str, size_t len) noexcept;
constexpr wcstring_view operator"" csv(const wchar_t* str, size_t len) noexcept;
#ifndef _MSC_VER
#pragma GCC diagnostic pop
#else
#pragma warning(pop)
#endif
}
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[pre-commit] reported by reviewdog 🐶

namespace beman {
template<class charT, class traits /* = char_traits<charT> */>
class basic_cstring_view {
public:
// types
using traits_type = traits;
using value_type = charT;
using pointer = value_type*;
using const_pointer = const value_type*;
using reference = value_type&;
using const_reference = const value_type&;
using const_iterator = const charT*; // see [cstring.view.iterators]
using iterator = const_iterator;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
using reverse_iterator = const_reverse_iterator;
using size_type = size_t;
using difference_type = ptrdiff_t;
static constexpr size_type npos = size_type(-1);
// [cstring.view.cons], construction and assignment
constexpr basic_cstring_view() noexcept : size_() {
static const charT empty_string[1]{};
data_ = std::data(empty_string);
}
constexpr basic_cstring_view(const basic_cstring_view&) noexcept = default;
constexpr basic_cstring_view& operator=(const basic_cstring_view&) noexcept = default;
constexpr basic_cstring_view(const charT* str) : basic_cstring_view(str, traits::length(str)) {}
constexpr basic_cstring_view(const charT* str, size_type len) : data_(str), size_(len) {
assert(str[len] == charT());
}
constexpr basic_cstring_view(std::nullptr_t) = delete;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[pre-commit] reported by reviewdog 🐶

// NOTE: Not part of proposal, just to make examples work since I can't add the conversion operator to
// basic_string.
template<typename Traits, typename Allocator>
constexpr basic_cstring_view(const std::basic_string<charT, Traits, Allocator>& str)
: basic_cstring_view(str.c_str(), str.size()) {}

@dascandy dascandy changed the title fix: workaround llvm bug, add release-mode defined behavior fix: switch to std::nullptr_t, add release-mode defined behavior Aug 20, 2025
assert(str[len] == charT());
}
basic_cstring_view(nullptr_t) = delete;
constexpr basic_cstring_view(std::nullptr_t) = delete;
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

turns out that it is a bug in Clang/LLVM. llvm/llvm-project#154577

@dascandy dascandy merged commit 35d0dfc into main Aug 20, 2025
118 of 136 checks passed
@dascandy dascandy deleted the fix-final-errors branch August 20, 2025 18:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant