// 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 "base/containers/span.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_span.h"
struct S {
S(base::span<int> ptr) : ptr_(ptr) {}
base::span<int> get();
// TODO: Currently return type is rewritten to: const base::span<int>
// Expected rewrite:
// static inline base::span<const int>
// SetWrapperInInlineStorage(base::span<int> isolate, int* object);
template <bool entered_context = true>
static inline const base::span<int> SetWrapperInInlineStorage(
base::span<int> isolate,
int* object);
base::raw_span<int> ptr_;
};
// TODO: Currently return type is rewritten to: const base::span<int>
// Expected rewrite:
// base::span<const int> SetWrapperInInlineStorage(base::span<int> isolate, int*
// object);
template <bool entered_context>
const base::span<int> S::SetWrapperInInlineStorage(base::span<int> isolate,
int* object) {
(void)isolate[0];
return isolate;
}
base::span<int> S::get() {
// Expected rewrite:
// const int* temp = ptr_.data();
const int* temp = ptr_.data();
// Expected rewrite:
// temp = SetWrapperInInlineStorage({}, nullptr).data();
temp = SetWrapperInInlineStorage({}, nullptr).data();
// Expected rewrite:
// base::span<const int> ptr = SetWrapperInInlineStorage({}, nullptr);
base::span<const int> ptr = SetWrapperInInlineStorage({}, nullptr);
// Leads ptr to be rewritten, and thus SetWrapperInInlineStorage return type.
(void)ptr[0];
// Expected rewrite:
// base::span<const int> temp2 = ptr_;
base::span<const int> temp2 = ptr_;
// Expected rewrite:
// const base::span<const int> temp3 = temp2;
const base::span<const int> temp3 = temp2;
// Expected rewrite:
// base::span<const int> temp4 = temp3;
base::span<const int> temp4 = temp3;
// Expected rewrite:
// const base::span<const int> temp5 = temp4;
const base::span<const int> temp5 = temp4;
// Leads temp5 to be rewritten.
(void)temp5[0];
return ptr_;
}
char fct() {
// Expected rewrite:
// base::span<int> var = {};
base::span<int> var = {};
S obj(var);
// Expected rewrite:
// base::span<int> v2 = obj.get();
base::span<int> v2 = obj.get();
return v2[0];
}
struct S2 {
// Expected rewrite:
// S2(base::span<int> ptr) : ptr_(ptr) {}
S2(base::span<int> ptr) : ptr_(ptr) {}
int* get_and_advance() {
// Expected rewrite:
// return ptr_++.data();
return ptr_++.data();
}
// Expected rewrite:
// base::raw_span<int> ptr_;
base::raw_span<int> ptr_;
};
void fct2() {
// Expected rewrite:
// S2 obj({});
S2 obj({});
}