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 Mandelbaum void 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 Mandelbaum void 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 Mandelbaum void 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 Mandelbaum void 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 Mandelbaum void 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