1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <array>
#include <cstdint>
#include <string>
#include <vector>
#include "base/containers/span.h"
#include "base/numerics/safe_conversions.h"
int UnsafeIndex();
// Expected rewrite:
// void TakePointerIntoContainer(base::span<int> into_container) {
void TakePointerIntoContainer(base::span<int> into_container) {
into_container[UnsafeIndex()] = 13;
}
// Expected rewrite:
// void TakePointerIntoCharContainer(base::span<char> into_container) {
void TakePointerIntoCharContainer(base::span<char> into_container) {
into_container[UnsafeIndex()] = 'a';
}
int main() {
// Test basic rewrite functionality on `std::vector`, the original
// motivator for this.
std::vector<int> vector = {13, 26, 39, 52};
// Expected rewrite:
// TakePointerIntoContainer(vector);
TakePointerIntoContainer(vector);
// Expected rewrite:
// TakePointerIntoContainer(base::span<int>(vector).subspan(2u));
TakePointerIntoContainer(base::span<int>(vector).subspan(2u));
int cached_index = UnsafeIndex();
// Expected rewrite:
// TakePointerIntoContainer(base::span<int>(vector).subspan(
// base::checked_cast<size_t>(cached_index)));
TakePointerIntoContainer(base::span<int>(vector).subspan(
base::checked_cast<size_t>(cached_index)));
// Expected rewrite:
// TakePointerIntoContainer(base::span<int>(vector).subspan(
// base::checked_cast<size_t>(UnsafeIndex())));
TakePointerIntoContainer(base::span<int>(vector).subspan(
base::checked_cast<size_t>(UnsafeIndex())));
// Also test basic rewrite functionality on `std::array`.
auto array = std::to_array<int>({13, 26, 39, 52});
// Expected rewrite:
// TakePointerIntoContainer(array);
TakePointerIntoContainer(array);
// Expected rewrite:
// TakePointerIntoContainer(base::span<int>(array).subspan(2u));
TakePointerIntoContainer(base::span<int>(array).subspan(2u));
// TODO: no rewriting is done here. Investigate.
// Test basic rewrite functionality on `std::string`.
std::string string = "Hello there!";
// TODO: no rewriting is done here. Investigate.
// Expected rewrite:
// TakePointerIntoContainer(string);
TakePointerIntoCharContainer(&string[0]);
// TODO: no rewriting is done here. Investigate.
// Expected rewrite:
// TakePointerIntoContainer(base::span<char>(string).subspan(2));
TakePointerIntoCharContainer(&string[2]);
return 0;
}
|