| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include <cstdint> |
| #include <map> |
| #include <optional> |
| #include <vector> |
| |
| #include "base/containers/span.h" |
| |
| class SomeClass {}; |
| |
| // No error expected. Only class/struct members are enforced. |
| int get(base::span<int> s) { |
| return 0; |
| } |
| |
| // Since base::span internally stores a pointer, base::span class/struct members |
| // should internally store a raw_ptr. For this reason base::raw_span should be |
| // used instead of base::span for class/struct members. |
| class MyClass { |
| public: |
| using IntSpan = base::span<int>; |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| base::span<SomeClass> member1; |
| |
| // No error expected. |
| int int_field; |
| |
| // Error expected. |
| // IntSpan is an alias for base::span, base::raw_span should be used instead |
| // of base::span for class/struct members. |
| IntSpan member2; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| std::vector<base::span<SomeClass>> member3; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members (including container template arguments). |
| std::map<int, base::span<SomeClass>> member4; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members (including container template arguments). |
| std::map<base::span<SomeClass>, SomeClass*> member5; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members (including container template arguments). |
| std::map<base::span<SomeClass>, base::span<SomeClass>> member6; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| base::span<SomeClass> member7; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members (including container template arguments). |
| std::vector<base::span<SomeClass>> member8; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| std::optional<base::span<SomeClass>> member9; |
| |
| // No error expected. Already using base::raw_span |
| base::raw_span<SomeClass> raw_span_member; |
| |
| // No error expected. Already using base::raw_span |
| std::vector<base::raw_span<SomeClass>> raw_span_container; |
| |
| // No error expected. Already using base::raw_span |
| std::optional<base::raw_span<SomeClass>> optional_raw_span; |
| |
| // No errors expected for the following fields. |
| // const char*, const wchar_t*, const char8_t*, const char16_t*, const |
| // char32_t* are excluded from the rewrite because there are likely pointing |
| // to string literal, which wouldn't be protected by MiraclePtr. |
| base::span<const char> const_char_span_field; |
| base::span<const wchar_t> const_wchar_span_field; |
| base::span<const char8_t> const_char8_span_field; |
| base::span<const char16_t> const_char16_span_field; |
| base::span<const char32_t> const_char32_span_field; |
| std::optional<base::span<const char>> optional_const_char_span_field; |
| std::optional<base::span<const wchar_t>> optional_const_wchar_span_field; |
| std::optional<base::span<const char8_t>> optional_const_char8_span_field; |
| std::optional<base::span<const char16_t>> optional_const_char16_span_field; |
| std::optional<base::span<const char32_t>> optional_const_char32_span_field; |
| std::vector<base::span<const char>> vector_const_char_span_field; |
| std::vector<base::span<const wchar_t>> vector_const_wchar_span_field; |
| std::vector<base::span<const char8_t>> vector_const_char8_span_field; |
| std::vector<base::span<const char16_t>> vector_const_char16_span_field; |
| std::vector<base::span<const char32_t>> vector_const_char32_span_field; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| base::span<char> char_span; |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| base::span<wchar_t> wide_char_span; |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| base::span<char8_t> char8_span; |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| base::span<char16_t> char16_span; |
| // Error expected. |
| // base::raw_span should be used instead of base::span for class/struct |
| // members. |
| base::span<char32_t> char32_span; |
| // Error expected. const uint8_t pointers don't point to string literals. |
| // base::raw_span should be used instead of base::span |
| base::span<const uint8_t> const_uint8_span; |
| // Error expected. const int8_t pointers don't point to string literals. |
| // base::raw_span should be used instead of base::span |
| base::span<const int8_t> const_int8_span; |
| // Error expected. const unsigned char don't point to string literals. |
| // base::raw_span should be used instead of base::span |
| base::span<const unsigned char> const_unsigned_char_span; |
| // Error expected. const signed char pointers don't point to string literals. |
| // base::raw_span should be used instead of base::span |
| base::span<const signed char> const_signed_char_span; |
| }; |
| |
| // The field below won't compile without the |typename| keyword (because |
| // at this point we don't know if MaybeProvidesType<T>::Type is a type, |
| // value or something else). |
| template <typename T> |
| struct MaybeProvidesType; |
| template <typename T> |
| struct DependentNameTest { |
| // Error expected. |
| // base::raw_span should be used instead of base::span for members. |
| base::span<typename MaybeProvidesType<T>::Type> span_field; |
| // Error expected. |
| // base::raw_span should be used instead of base::span for members. |
| std::vector<base::span<typename MaybeProvidesType<T>::Type>> |
| vector_of_span_field; |
| // Error expected. |
| // base::raw_span should be used instead of base::span for members. |
| std::optional<base::span<typename MaybeProvidesType<T>::Type>> |
| optional_span_field; |
| |
| // Error expected. |
| // base::raw_span should be used instead of base::span for members. |
| std::vector<std::optional<base::span<typename MaybeProvidesType<T>::Type>>> |
| vector_of_optional_span_field; |
| }; |