tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TestTempRefPtr.cpp (2357B)


      1 #include <mozilla/RefPtr.h>
      2 
      3 using namespace mozilla;
      4 
      5 struct RefCountedBase {
      6  void AddRef();
      7  void Release();
      8 
      9  void method_test();
     10 };
     11 
     12 struct RefCountedBaseHolder {
     13  RefPtr<RefCountedBase> GetRefCountedBase() const {
     14    return mRefCountedBase;
     15  }
     16 
     17 private:
     18  RefPtr<RefCountedBase> mRefCountedBase = MakeRefPtr<RefCountedBase>();
     19 };
     20 
     21 
     22 void test_arrow_temporary_new_refptr_function_style_cast() {
     23  RefPtr<RefCountedBase>(new RefCountedBase())->method_test(); // expected-warning {{performance issue: temporary 'RefPtr<RefCountedBase>' is only dereferenced here once which involves short-lived AddRef/Release calls}}
     24 }
     25 
     26 void test_arrow_temporary_new_refptr_brace() {
     27  RefPtr<RefCountedBase>{new RefCountedBase()}->method_test(); // expected-warning {{performance issue: temporary 'RefPtr<RefCountedBase>' is only dereferenced here once which involves short-lived AddRef/Release calls}}
     28 }
     29 
     30 void test_arrow_temporary_new_c_style_cast() {
     31  ((RefPtr<RefCountedBase>)(new RefCountedBase()))->method_test(); // expected-warning {{performance issue: temporary 'RefPtr<RefCountedBase>' is only dereferenced here once which involves short-lived AddRef/Release calls}}
     32 }
     33 
     34 void test_arrow_temporary_new_static_cast() {
     35  static_cast<RefPtr<RefCountedBase>>(new RefCountedBase())->method_test(); // expected-warning {{performance issue: temporary 'RefPtr<RefCountedBase>' is only dereferenced here once which involves short-lived AddRef/Release calls}}
     36 }
     37 
     38 void test_arrow_temporary_new_refptr_makerefptr() {
     39  MakeRefPtr<RefCountedBase>()->method_test(); // expected-warning {{performance issue: temporary 'RefPtr<RefCountedBase>' is only dereferenced here once which involves short-lived AddRef/Release calls}}
     40 }
     41 
     42 void test_arrow_temporary_get_refptr_from_member_function() {
     43  const RefCountedBaseHolder holder;
     44  holder.GetRefCountedBase()->method_test(); // expected-warning {{performance issue: temporary 'RefPtr<RefCountedBase>' is only dereferenced here once which involves short-lived AddRef/Release calls}} expected-note {{consider changing function RefCountedBaseHolder::GetRefCountedBase to return a raw reference instead}}
     45 }
     46 
     47 void test_ref(RefCountedBase &aRefCountedBase);
     48 
     49 void test_star_temporary_new_refptr_function_style_cast() {
     50  // TODO: Should we warn about operator* as well?
     51  test_ref(*RefPtr<RefCountedBase>(new RefCountedBase()));
     52 }