// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <vector>
#include "base/memory/raw_ptr.h"
struct S {};
struct obj {
// Expected rewrite: const std::vector<raw_ptr<S>>& get();
const std::vector<raw_ptr<S>>& get() { return member; }
// Expected rewrite: std::vector<raw_ptr<S>> member;
std::vector<raw_ptr<S>> member;
};
// No rewrite expected.
std::vector<S*> get_value() {
return {};
}
// No rewrite expected.
std::vector<S*>* get_ptr() {
return nullptr;
}
// No rewrite expected.
std::vector<S*> unrelated_fct() {
return {};
}
void fct() {
obj o;
{
// Expected rewrite: std::vector<raw_ptr<S>> temp = o.member;
std::vector<raw_ptr<S>> temp = o.member;
// Expected rewrite: std::vector<raw_ptr<S>> temp2{temp};
std::vector<raw_ptr<S>> temp2{temp};
}
{
// Expected rewrite: std::vector<raw_ptr<S>>& temp = o.member;
std::vector<raw_ptr<S>>& temp = o.member;
// Expected rewrite: std::vector<raw_ptr<S>> temp2{temp};
std::vector<raw_ptr<S>> temp2{temp};
}
{
// Expected rewrite: const std::vector<raw_ptr<S>>& temp = o.member;
const std::vector<raw_ptr<S>>& temp = o.member;
// Expected rewrite: std::vector<raw_ptr<S>> temp2{temp};
std::vector<raw_ptr<S>> temp2{temp};
}
{
// Expected rewrite: std::vector<raw_ptr<S>>* temp = &o.member;
std::vector<raw_ptr<S>>* temp = &o.member;
// Expected rewrite: std::vector<raw_ptr<S>> temp2{*temp};
std::vector<raw_ptr<S>> temp2{*temp};
}
{
// Expected rewrite: []() -> std::vector<raw_ptr<S>> { return {}; };
auto init = []() -> std::vector<raw_ptr<S>> { return {}; };
o.member = init();
// Expected rewrite: std::vector<raw_ptr<S>> temp = init();
std::vector<raw_ptr<S>> temp = init();
}
{
// Expected rewrite:
// [&]() -> std::vector<raw_ptr<S>>* { return &o.member; };
auto fct = [&]() -> std::vector<raw_ptr<S>>* { return &o.member; };
// Expected rewrite: std::vector<raw_ptr<S>> a = *fct();
std::vector<raw_ptr<S>> a = *fct();
// Expected rewrite:
// std::vector<raw_ptr<S>>::iterator it = (*fct()).begin();
std::vector<raw_ptr<S>>::iterator it = fct()->begin();
}
{
// Expected rewrite:
// [&]() -> const std::vector<raw_ptr<S>>& { return o.member; };
auto fct = [&]() -> const std::vector<raw_ptr<S>>& { return o.member; };
// Expected rewrite: std::vector<raw_ptr<S>> a = &fct();
const std::vector<raw_ptr<S>>* a = &fct();
// Expected rewrite:
// std::vector<raw_ptr<S>>::const_iterator it = fct().begin();
std::vector<raw_ptr<S>>::const_iterator it = fct().begin();
}
{
// Expected rewrite: std::vector<raw_ptr<S>>::iterator
std::vector<raw_ptr<S>>::iterator it = o.member.begin();
// Expected rewrite: std::vector<raw_ptr<S>>::reverse_iterator
std::vector<raw_ptr<S>>::reverse_iterator it2 = o.member.rbegin();
// Expected rewrite: std::vector<raw_ptr<S>>::const_iterator
std::vector<raw_ptr<S>>::const_iterator it3 = o.member.cbegin();
// Expected rewrite: std::vector<raw_ptr<S>>::const_reverse_iterator
std::vector<raw_ptr<S>>::const_reverse_iterator it4 = o.member.crbegin();
}
{
// Expected rewrite: std::vector<raw_ptr<S>>::iterator
std::vector<raw_ptr<S>>::iterator it = o.member.end();
// Expected rewrite: std::vector<raw_ptr<S>>::reverse_iterator
std::vector<raw_ptr<S>>::reverse_iterator it2 = o.member.rend();
// Expected rewrite: std::vector<raw_ptr<S>>::const_iterator
std::vector<raw_ptr<S>>::const_iterator it3 = o.member.cend();
// Expected rewrite: std::vector<raw_ptr<S>>::const_reverse_iterator
std::vector<raw_ptr<S>>::const_reverse_iterator it4 = o.member.crend();
}
{
// create a link with a member to propagate the rewrite.
std::vector<raw_ptr<S>> a = o.member;
// Expected rewrite: std::vector<raw_ptr<S>> b;
std::vector<raw_ptr<S>> b;
// Expected rewrite: b = (a.size() > 0) ? a : std::vector<raw_ptr<S>>();
b = (a.size() > 0) ? a : std::vector<raw_ptr<S>>();
}
{
// Expected rewrite: std::vector<raw_ptr<S>> a = o.member;
std::vector<raw_ptr<S>> a = o.member;
// This tests whether the implicit lambda field is rewritten.
auto fct = [&a]() { a.push_back(nullptr); };
}
}