| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <memory> |
| |
| #include "values.h" |
| |
| #define true true |
| |
| base::ListValue* ReturnsRawPtr() { |
| return nullptr; |
| } |
| |
| std::unique_ptr<base::Value> ReturnsUniquePtr() { |
| return nullptr; |
| } |
| |
| // The joy of raw pointers. |
| void DoesItTakeOwnership(base::Value*) {} |
| |
| struct Thing { |
| std::unique_ptr<base::Value> ToValue() { return nullptr; } |
| }; |
| |
| void F() { |
| base::ListValue list; |
| list.Append(new base::Value(1 == 0)); |
| list.Append(new base::Value(true)); |
| list.Append(new base::Value(static_cast<unsigned char>(1.0))); |
| list.Append(new base::Value(double{3})); |
| list.Append(new base::Value("abc")); |
| |
| list.Append(ReturnsUniquePtr().release()); |
| Thing thing; |
| list.Append(thing.ToValue().release()); |
| std::unique_ptr<base::Value> unique_ptr_var; |
| list.Append(unique_ptr_var.release()); |
| } |
| |
| void G(base::Value* input) { |
| base::ListValue list; |
| |
| base::ListValue* local = new base::ListValue(); |
| // Not rewritten, since it often makes more sense to change the function |
| // prototype. |
| local->Append(input); |
| // Should be rewritten: it will only be moved after it's no longer referenced. |
| list.Append(local); |
| |
| // Not rewritten, since it would be used after it's moved. In theory, we could |
| // automatically handle this too, but the risk of accidentally breaking |
| // something is much higher. |
| base::ListValue* clever_list = new base::ListValue; |
| list.Append(clever_list); |
| clever_list->AppendInteger(2); |
| |
| // Not rewritten, since it often makes more sense to change the function |
| // prototype. |
| base::Value* returned_value = ReturnsRawPtr(); |
| list.Append(returned_value); |
| |
| // Should be rewritten. The reassignment should be transformed into |
| // .reset(). |
| base::ListValue* reused_list = new base::ListValue; |
| reused_list->AppendInteger(1); |
| list.Append(reused_list); |
| reused_list = new base::ListValue; |
| reused_list->AppendInteger(3); |
| list.Append(reused_list); |
| |
| // This shouldn't be rewritten, since the reassignment is the return |
| // value of a function. |
| base::ListValue* reused_list_2 = new base::ListValue; |
| reused_list_2->AppendInteger(4); |
| list.Append(reused_list_2); |
| reused_list_2 = ReturnsRawPtr(); |
| reused_list_2->AppendInteger(5); |
| list.Append(reused_list_2); |
| |
| // auto should be expanded to a std::unique_ptr containing the deduced type. |
| auto* auto_list = new base::ListValue; |
| auto_list->AppendInteger(6); |
| list.Append(auto_list); |
| |
| auto auto_list_2 = new base::ListValue; |
| auto_list_2->AppendInteger(7); |
| list.Append(auto_list_2); |
| |
| // Shouldn't be rewritten: a raw pointer is passed to a function which may or |
| // may not take ownership. |
| base::ListValue* maybe_owned_list = new base::ListValue; |
| DoesItTakeOwnership(maybe_owned_list); |
| list.Append(maybe_owned_list); |
| |
| // Should be rewritten, even though it doesn't have an initializer. |
| base::ListValue* list_with_no_initializer; |
| list_with_no_initializer = new base::ListValue; |
| list.Append(list_with_no_initializer); |
| |
| // Make sure C++98 style initialization is correctly handled. |
| base::ListValue* cxx98_list(new base::ListValue); |
| list.Append(cxx98_list); |
| |
| // C++11 style syntax currently causes the tool to bail out: this is banned in |
| // Chromium style anyway. |
| base::ListValue* cxx11_list{new base::ListValue}; |
| list.Append(cxx11_list); |
| } |