================
@@ -0,0 +1,138 @@
+// RUN: %check_clang_tidy %s abseil-unchecked-statusor-access %t -- 
-header-filter='' -- -I %S/Inputs
+
+#include "absl/status/statusor.h"
+void unchecked_value_access(const absl::StatusOr<int>& sor) {
+  sor.value();
+  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: unchecked access to 
'absl::StatusOr' value [abseil-unchecked-statusor-access]
+}
+
+void unchecked_value_or_die_access(const absl::StatusOr<int>& sor) {
+  sor.ValueOrDie();
+  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: unchecked access to 
'absl::StatusOr' value [abseil-unchecked-statusor-access]
+}
+
+void unchecked_deref_operator_access(const absl::StatusOr<int>& sor) {
+  *sor;
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: unchecked access to 
'absl::StatusOr' value [abseil-unchecked-statusor-access]
+}
+
+struct Foo {
+  void foo() const {}
+};
+
+void unchecked_arrow_operator_access(const absl::StatusOr<Foo>& sor) {
+  sor->foo();
+  // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: unchecked access to 
'absl::StatusOr' value [abseil-unchecked-statusor-access]
+}
+
+void f2(const absl::StatusOr<int>& sor) {
+  if (sor.ok()) {
+    sor.value();
+  }
+}
+
+template <typename T>
+void function_template_without_user(const absl::StatusOr<T>& sor) {
+  sor.value(); // no-warning
+}
+
+template <typename T>
+void function_template_with_user(const absl::StatusOr<T>& sor) {
+  sor.value();
+  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: unchecked access to 
'absl::StatusOr' value [abseil-unchecked-statusor-access]
+}
+
+void function_template_user(const absl::StatusOr<int>& sor) {
+  // Instantiate the f3 function template so that it gets matched by the check.
+  function_template_with_user(sor);
+}
+
+template<typename T>
+void function_template_with_specialization(const absl::StatusOr<int>& sor) {
+  sor.value(); // no-warning
+}
+
+template<>
+void function_template_with_specialization<int>(const absl::StatusOr<int>& 
sor) {
+  sor.value();
+  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: unchecked access to 
'absl::StatusOr' value [abseil-unchecked-statusor-access]
+}
+
+
+template <typename T>
+class ClassTemplateWithSpecializations {
+  void f(const absl::StatusOr<int>& sor) {
+    sor.value(); // no-warning
+  }
+};
+
+template<typename T>
+class ClassTemplateWithSpecializations<T*> {
+  void f(const absl::StatusOr<int>& sor) {
+    sor.value(); // no-warning
+  }
+};
+
+template<>
+class ClassTemplateWithSpecializations<int> {
+  void f(const absl::StatusOr<int>& sor) {
+    sor.value();
+    // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: unchecked access to 
'absl::StatusOr' value [abseil-unchecked-statusor-access]
+  }
+};
+
+// The templates below are not instantiated and CFGs can not be properly built
+// for them. They are here to make sure that the checker does not crash, but
+// instead ignores non-instantiated templates.
+
+template <typename T>
+struct C1 {};
+
+template <typename T>
+struct C2 : public C1<T> {
+  ~C2() {}
+};
+
+template <typename T, template <class> class B>
+struct C3 : public B<T> {
+  ~C3() {}
+};
+
+void multiple_unchecked_accesses(absl::StatusOr<int> sor1,
+                                 absl::StatusOr<int> sor2) {
+  for (int i = 0; i < 10; i++) {
+    sor1.ValueOrDie();
----------------
fmayer wrote:

done

https://github.com/llvm/llvm-project/pull/171188
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to