brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 1ef7d16 Raw
118 lines · cpp
1// RUN: %check_clang_tidy -std=c++11-or-later %s performance-no-automatic-move %t2 3struct Obj {4  Obj();5  Obj(const Obj &);6  Obj(Obj &&);7  virtual ~Obj();8};9 10struct NonTemplate {11  NonTemplate(const Obj &);12  NonTemplate(Obj &&);13};14 15template <typename T> struct TemplateCtorPair {16  TemplateCtorPair(const T &);17  TemplateCtorPair(T &&value);18};19 20template <typename T> struct UrefCtor {21  template <class U = T> UrefCtor(U &&value);22};23 24template <typename T>25T Make();26 27NonTemplate PositiveNonTemplate() {28  const Obj obj = Make<Obj>();29  return obj; // selects `NonTemplate(const Obj&)`30  // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: constness of 'obj' prevents31  // automatic move [performance-no-automatic-move]32}33 34TemplateCtorPair<Obj> PositiveTemplateCtorPair() {35  const Obj obj = Make<Obj>();36  return obj; // selects `TemplateCtorPair(const T&)`37  // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: constness of 'obj' prevents38  // automatic move [performance-no-automatic-move]39}40 41UrefCtor<Obj> PositiveUrefCtor() {42  const Obj obj = Make<Obj>();43  return obj; // selects `UrefCtor(const T&&)`44  // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: constness of 'obj' prevents45  // automatic move [performance-no-automatic-move]46}47 48Obj PositiveCantNrvo(bool b) {49  const Obj obj1;50  const Obj obj2;51  if (b) {52    return obj1;53    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constness of 'obj1' prevents automatic move [performance-no-automatic-move]54  }55  return obj2;56  // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: constness of 'obj2' prevents automatic move [performance-no-automatic-move]57}58 59// FIXME: Ideally we would warn here too.60NonTemplate PositiveNonTemplateLifetimeExtension() {61  const Obj &obj = Make<Obj>();62  return obj;63}64 65// FIXME: Ideally we would warn here too.66UrefCtor<Obj> PositiveUrefCtorLifetimeExtension() {67  const Obj &obj = Make<Obj>();68  return obj;69}70 71// Negatives.72 73UrefCtor<Obj> Temporary() { return Make<Obj>(); }74 75UrefCtor<Obj> ConstTemporary() { return Make<const Obj>(); }76 77UrefCtor<Obj> ConvertingMoveConstructor() {78  Obj obj = Make<Obj>();79  return obj;80}81 82Obj ConstNrvo() {83  const Obj obj = Make<Obj>();84  return obj;85}86 87Obj NotNrvo(bool b) {88  Obj obj1;89  Obj obj2;90  if (b) {91    return obj1;92  }93  return obj2;94}95 96UrefCtor<Obj> Ref() {97  Obj &obj = Make<Obj &>();98  return obj;99}100 101UrefCtor<Obj> ConstRef() {102  const Obj &obj = Make<Obj &>();103  return obj;104}105 106const Obj global;107 108UrefCtor<Obj> Global() { return global; }109 110struct FromConstRefOnly {111  FromConstRefOnly(const Obj &);112};113 114FromConstRefOnly FromConstRefOnly() {115  const Obj obj = Make<Obj>();116  return obj;117}118