122 lines · cpp
1// RUN: %check_clang_tidy %s bugprone-misleading-setter-of-reference %t2 3struct X {4 X &operator=(const X &) { return *this; }5private:6 int &Mem;7 friend class Test1;8};9 10class Test1 {11 X &MemX;12 int &MemI;13protected:14 long &MemL;15public:16 long &MemLPub;17 18 Test1(X &MemX, int &MemI, long &MemL) : MemX(MemX), MemI(MemI), MemL(MemL), MemLPub(MemL) {}19 void setI(int *NewValue) {20 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setI' can be mistakenly used in order to change the reference 'MemI' instead of the value of it21 MemI = *NewValue;22 }23 void setL(long *NewValue) {24 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setL' can be mistakenly used in order to change the reference 'MemL' instead of the value of it25 MemL = *NewValue;26 }27 void setX(X *NewValue) {28 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setX' can be mistakenly used in order to change the reference 'MemX' instead of the value of it29 MemX = *NewValue;30 }31 void set1(int *NewValue) {32 MemX.Mem = *NewValue;33 }34 void set2(int *NewValue) {35 MemL = static_cast<long>(*NewValue);36 }37 void set3(int *NewValue) {38 MemI = *NewValue;39 MemL = static_cast<long>(*NewValue);40 }41 void set4(long *NewValue, int) {42 MemL = *NewValue;43 }44 void setLPub(long *NewValue) {45 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setLPub' can be mistakenly used in order to change the reference 'MemLPub' instead of the value of it46 MemLPub = *NewValue;47 }48 49private:50 void set5(long *NewValue) {51 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'set5' can be mistakenly used in order to change the reference 'MemL' instead of the value of it52 MemL = *NewValue;53 }54};55 56class Base {57protected:58 int &MemI;59};60 61class Derived : public Base {62public:63 void setI(int *NewValue) {64 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setI' can be mistakenly used in order to change the reference 'MemI' instead of the value of it65 MemI = *NewValue;66 }67};68 69using UIntRef = unsigned int &;70using UIntPtr = unsigned int *;71using UInt = unsigned int;72 73class AliasTest {74 UIntRef Value1;75 UInt &Value2;76 unsigned int &Value3;77public:78 void setValue1(UIntPtr NewValue) {79 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setValue1' can be mistakenly used in order to change the reference 'Value1' instead of the value of it80 Value1 = *NewValue;81 }82 void setValue2(unsigned int *NewValue) {83 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setValue2' can be mistakenly used in order to change the reference 'Value2' instead of the value of it84 Value2 = *NewValue;85 }86 void setValue3(UInt *NewValue) {87 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setValue3' can be mistakenly used in order to change the reference 'Value3' instead of the value of it88 Value3 = *NewValue;89 }90};91 92template <typename T>93class TemplateTest {94 T &Mem;95public:96 TemplateTest(T &V) : Mem{V} {}97 void setValue(T *NewValue) {98 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setValue' can be mistakenly used in order to change the reference 'Mem' instead of the value of it99 Mem = *NewValue;100 }101};102 103void f_TemplateTest(char *Value) {104 char CharValue;105 TemplateTest<char> TTChar{CharValue};106 TTChar.setValue(Value);107}108 109template <typename T>110class AddMember {111protected:112 T &Value;113};114 115class TemplateBaseTest : public AddMember<int> {116public:117 void setValue(int *NewValue) {118 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: function 'setValue' can be mistakenly used in order to change the reference 'Value' instead of the value of it119 Value = *NewValue;120 }121};122