================
@@ -3691,6 +3691,155 @@ TEST_P(UncheckedStatusOrAccessModelTest,
UniquePtrReset) {
)cc");
}
+TEST_P(UncheckedStatusOrAccessModelTest, NestedStatusOrInStatusOrStruct) {
+ // Non-standard assignment with a nested StatusOr.
+ ExpectDiagnosticsFor(
+ R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+
+ struct Inner {
+ absl::StatusOr<std::string> sor;
+ };
+
+ struct Outer {
+ absl::StatusOr<Inner> inner;
+ };
+
+ void target() {
+ Outer foo = Make<Outer>();
+ foo.inner->sor = "a"; // [[unsafe]]
+ }
+ )cc");
+
+ ExpectDiagnosticsFor(
+ R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+
+ struct Foo {
+ absl::StatusOr<std::string> sor;
+ };
+
+ void target(const absl::StatusOr<Foo>& foo) {
+ if (foo.ok() && foo->sor.ok()) foo->sor.value();
+ }
+ )cc");
+
+ ExpectDiagnosticsFor(
+ R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+
+ struct Foo {
+ absl::StatusOr<std::string> sor;
+ };
+
+ void target(const absl::StatusOr<Foo>& foo) {
+ if (foo.ok() && (*foo).sor.ok()) (*foo).sor.value();
+ }
+ )cc");
+
+ // With assignment.
+ ExpectDiagnosticsFor(
+ R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+
+ struct Foo {
+ absl::StatusOr<std::string> sor;
+ };
+
+ void target(absl::StatusOr<Foo>& foo) {
+ if (foo.ok() && foo->sor.ok()) {
+ foo->sor = Make<absl::StatusOr<std::string>>();
+ foo->sor.value(); // [[unsafe]]
+ }
+ }
+ )cc");
+
+ ExpectDiagnosticsFor(
+ R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+
+ struct Foo {
+ absl::StatusOr<std::string> sor;
+ };
+
+ void target(absl::StatusOr<Foo>& foo) {
+ if (foo.ok() && foo->sor.ok()) {
+ auto n = Make<absl::StatusOr<std::string>>();
+ if (n.ok()) foo->sor = n;
+ foo->sor.value();
+ }
+ }
+ )cc");
+
+ ExpectDiagnosticsFor(
+ R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+
+ struct Foo {
+ absl::StatusOr<std::string> sor;
+ };
+
+ void target(absl::StatusOr<Foo>& foo) {
+ if (foo.ok() && foo->sor.ok()) {
+ auto n = Make<absl::StatusOr<std::string>>();
+ if (n.ok()) foo->sor = std::move(n);
+ foo->sor.value();
+ }
+ }
+ )cc");
+
+ ExpectDiagnosticsFor(
+ R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+
+ struct Foo {
+ absl::StatusOr<std::string> sor;
+ };
+
+ void target(absl::StatusOr<Foo>& foo) {
+ if (foo.ok() && foo->sor.ok()) *foo->sor;
+ }
+ )cc");
+
+ ExpectDiagnosticsFor(
----------------
fmayer wrote:
done
https://github.com/llvm/llvm-project/pull/170950
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits