// Copyright 2015 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. struct A { A&& Pass(); }; struct B { B& Pass(); }; struct C { A a; }; struct D { D&& NotPass(); }; struct E { E() : a(new A) {} ~E() { delete a; } A* a; }; struct F { explicit F(A&&); F&& Pass(); }; void Test() { // Pass that returns rvalue reference should use std::move. A a1; A a2 = a1.Pass(); // Pass that doesn't return a rvalue reference should not be rewritten. B b1; B b2 = b1.Pass(); // std::move() needs to wrap the entire expression when passing a member. C c; A a3 = c.a.Pass(); // Don't rewrite things that return rvalue references that aren't named Pass. D d1; D d2 = d1.NotPass(); // Pass via a pointer type should dereference the pointer first. E e; A a4 = e.a->Pass(); // Nested Pass() is handled correctly. A a5; F f = F(a5.Pass()).Pass(); // Chained Pass is handled correctly. A a6; A a7 = a6.Pass().Pass(); }