198550df7SYitzhak Mandelbaum // RUN: %check_clang_tidy %s bugprone-unchecked-optional-access %t -- \ 2*1af159e9SPiotr Zegar // RUN: -config="{CheckOptions: \ 3*1af159e9SPiotr Zegar // RUN: {bugprone-unchecked-optional-access.IgnoreSmartPointerDereference: true}}" -- \ 498550df7SYitzhak Mandelbaum // RUN: -I %S/Inputs/unchecked-optional-access 598550df7SYitzhak Mandelbaum 698550df7SYitzhak Mandelbaum #include "absl/types/optional.h" 798550df7SYitzhak Mandelbaum 898550df7SYitzhak Mandelbaum // Include some basic cases to ensure that IgnoreSmartPointerDereference doesn't 998550df7SYitzhak Mandelbaum // disable everything. Then check the relevant smart-pointer cases. 1098550df7SYitzhak Mandelbaum unchecked_deref_operator_access(const absl::optional<int> & opt)1198550df7SYitzhak Mandelbaumvoid unchecked_deref_operator_access(const absl::optional<int> &opt) { 1298550df7SYitzhak Mandelbaum *opt; 1398550df7SYitzhak Mandelbaum // CHECK-MESSAGES: :[[@LINE-1]]:4: warning: unchecked access to optional value 1498550df7SYitzhak Mandelbaum } 1598550df7SYitzhak Mandelbaum unchecked_value_access(const absl::optional<int> & opt)1698550df7SYitzhak Mandelbaumvoid unchecked_value_access(const absl::optional<int> &opt) { 1798550df7SYitzhak Mandelbaum opt.value(); 1898550df7SYitzhak Mandelbaum // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: unchecked access to optional value [bugprone-unchecked-optional-access] 1998550df7SYitzhak Mandelbaum } 2098550df7SYitzhak Mandelbaum 2198550df7SYitzhak Mandelbaum struct Foo { fooFoo2298550df7SYitzhak Mandelbaum void foo() const {} 2398550df7SYitzhak Mandelbaum }; 2498550df7SYitzhak Mandelbaum unchecked_arrow_operator_access(const absl::optional<Foo> & opt)2598550df7SYitzhak Mandelbaumvoid unchecked_arrow_operator_access(const absl::optional<Foo> &opt) { 2698550df7SYitzhak Mandelbaum opt->foo(); 2798550df7SYitzhak Mandelbaum // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: unchecked access to optional value 2898550df7SYitzhak Mandelbaum } 2998550df7SYitzhak Mandelbaum 3098550df7SYitzhak Mandelbaum template <typename T> 3198550df7SYitzhak Mandelbaum struct SmartPtr { 3298550df7SYitzhak Mandelbaum T& operator*() &; 3398550df7SYitzhak Mandelbaum T* operator->(); 3498550df7SYitzhak Mandelbaum }; 3598550df7SYitzhak Mandelbaum 3698550df7SYitzhak Mandelbaum struct Bar { 3798550df7SYitzhak Mandelbaum absl::optional<int> opt; 3898550df7SYitzhak Mandelbaum }; 3998550df7SYitzhak Mandelbaum 4098550df7SYitzhak Mandelbaum unchecked_value_access_through_smart_ptr(SmartPtr<absl::optional<int>> s)4198550df7SYitzhak Mandelbaumvoid unchecked_value_access_through_smart_ptr(SmartPtr<absl::optional<int>> s) { 4298550df7SYitzhak Mandelbaum s->value(); 4398550df7SYitzhak Mandelbaum (*s).value(); 4498550df7SYitzhak Mandelbaum 4598550df7SYitzhak Mandelbaum } 4698550df7SYitzhak Mandelbaum unchecked_value_access_through_smart_ptr_field(SmartPtr<Bar> s)4798550df7SYitzhak Mandelbaumvoid unchecked_value_access_through_smart_ptr_field(SmartPtr<Bar> s) { 4898550df7SYitzhak Mandelbaum s->opt.value(); 4998550df7SYitzhak Mandelbaum (*s).opt.value(); 5098550df7SYitzhak Mandelbaum 5198550df7SYitzhak Mandelbaum } 52