[nullability] Break out test cases for overloaded operators into separate tests. More fine-grained tests make it easier to see what exactly is failing when a test fails. I'm breaking these out now because I'm about to add a test for a free overloaded operator. PiperOrigin-RevId: 526847959
diff --git a/nullability_verification/test/function_calls.cc b/nullability_verification/test/function_calls.cc index 1162af6..26b295c 100644 --- a/nullability_verification/test/function_calls.cc +++ b/nullability_verification/test/function_calls.cc
@@ -39,29 +39,6 @@ } )cc")); - // overloaded operator call - EXPECT_TRUE(checkDiagnostics(R"cc( - struct MakeNonnull { - int *_Nonnull operator()(); - }; - struct MakeNullable { - int *_Nullable operator()(); - }; - struct MakeUnannotated { - int *operator()(); - }; - void target() { - MakeNonnull makeNonnull; - *makeNonnull(); - - MakeNullable makeNullable; - *makeNullable(); // [[unsafe]] - - MakeUnannotated makeUnannotated; - *makeUnannotated(); - } - )cc")); - // function pointer EXPECT_TRUE(checkDiagnostics(R"cc( void target(int* _Nonnull (*makeNonnull)(), @@ -148,42 +125,6 @@ } )cc")); - // overloaded operator with single param - EXPECT_TRUE(checkDiagnostics(R"cc( - // map<int * _Nonnull, int> - struct MapWithNonnullKeys { - int &operator[](int *_Nonnull key); - }; - // map<int * _Nullable, int> - struct MapWithNullableKeys { - int &operator[](int *_Nullable key); - }; - // map<int *, int> - struct MapWithUnannotatedKeys { - int &operator[](int *key); - }; - void target(int *_Nonnull ptr_nonnull, int *_Nullable ptr_nullable, - int *ptr_unannotated) { - MapWithNonnullKeys nonnull_keys; - nonnull_keys[nullptr] = 42; // [[unsafe]] - nonnull_keys[ptr_nonnull] = 42; - nonnull_keys[ptr_nullable] = 42; // [[unsafe]] - nonnull_keys[ptr_unannotated] = 42; - - MapWithNullableKeys nullable_keys; - nullable_keys[nullptr] = 42; - nullable_keys[ptr_nonnull] = 42; - nullable_keys[ptr_nullable] = 42; - nullable_keys[ptr_unannotated] = 42; - - MapWithUnannotatedKeys unannotated_keys; - unannotated_keys[nullptr] = 42; - unannotated_keys[ptr_nonnull] = 42; - unannotated_keys[ptr_nullable] = 42; - unannotated_keys[ptr_unannotated] = 42; - } - )cc")); - // free function with multiple params of mixed nullability EXPECT_TRUE(checkDiagnostics(R"cc( void takeMixed(int *, int *_Nullable, int *_Nonnull); @@ -192,17 +133,6 @@ } )cc")); - // overloaded operator with multiple params of mixed nullability - EXPECT_TRUE(checkDiagnostics(R"cc( - struct TakeMixed { - void operator()(int *, int *_Nullable, int *_Nonnull); - }; - void target() { - TakeMixed takeMixed; - takeMixed(nullptr, nullptr, nullptr); // [[unsafe]] - } - )cc")); - // member function EXPECT_TRUE(checkDiagnostics(R"cc( struct Foo { @@ -361,6 +291,80 @@ )cc")); } +TEST(PointerNullabilityTest, CallMemberOperatorNoParams) { + EXPECT_TRUE(checkDiagnostics(R"cc( + struct MakeNonnull { + int *_Nonnull operator()(); + }; + struct MakeNullable { + int *_Nullable operator()(); + }; + struct MakeUnannotated { + int *operator()(); + }; + void target() { + MakeNonnull makeNonnull; + *makeNonnull(); + + MakeNullable makeNullable; + *makeNullable(); // [[unsafe]] + + MakeUnannotated makeUnannotated; + *makeUnannotated(); + } + )cc")); +} + +TEST(PointerNullabilityTest, CallMemberOperatorOneParam) { + // overloaded operator with single param + EXPECT_TRUE(checkDiagnostics(R"cc( + // map<int * _Nonnull, int> + struct MapWithNonnullKeys { + int &operator[](int *_Nonnull key); + }; + // map<int * _Nullable, int> + struct MapWithNullableKeys { + int &operator[](int *_Nullable key); + }; + // map<int *, int> + struct MapWithUnannotatedKeys { + int &operator[](int *key); + }; + void target(int *_Nonnull ptr_nonnull, int *_Nullable ptr_nullable, + int *ptr_unannotated) { + MapWithNonnullKeys nonnull_keys; + nonnull_keys[nullptr] = 42; // [[unsafe]] + nonnull_keys[ptr_nonnull] = 42; + nonnull_keys[ptr_nullable] = 42; // [[unsafe]] + nonnull_keys[ptr_unannotated] = 42; + + MapWithNullableKeys nullable_keys; + nullable_keys[nullptr] = 42; + nullable_keys[ptr_nonnull] = 42; + nullable_keys[ptr_nullable] = 42; + nullable_keys[ptr_unannotated] = 42; + + MapWithUnannotatedKeys unannotated_keys; + unannotated_keys[nullptr] = 42; + unannotated_keys[ptr_nonnull] = 42; + unannotated_keys[ptr_nullable] = 42; + unannotated_keys[ptr_unannotated] = 42; + } + )cc")); +} + +TEST(PointerNullabilityTest, CallMemberOperatorMultipleParams) { + EXPECT_TRUE(checkDiagnostics(R"cc( + struct TakeMixed { + void operator()(int *, int *_Nullable, int *_Nonnull); + }; + void target() { + TakeMixed takeMixed; + takeMixed(nullptr, nullptr, nullptr); // [[unsafe]] + } + )cc")); +} + } // namespace } // namespace nullability } // namespace tidy