Produce nullability vectors for reference types. (These can't occur as expr types at the top level, but they matter internally) PiperOrigin-RevId: 528760251
diff --git a/nullability/type_nullability_test.cc b/nullability/type_nullability_test.cc index b9ba969..ba5cdca 100644 --- a/nullability/type_nullability_test.cc +++ b/nullability/type_nullability_test.cc
@@ -51,6 +51,20 @@ NullabilityKind::NonNull)); } +TEST_F(GetNullabilityAnnotationsFromTypeTest, References) { + // Top-level references can't be expression types, but we support them anyway + EXPECT_THAT(nullVec("int * _Nonnull &"), + ElementsAre(NullabilityKind::NonNull)); + EXPECT_THAT(nullVec("int * _Nonnull &&"), + ElementsAre(NullabilityKind::NonNull)); + + // ... and other types involving references can appear in expressions + EXPECT_THAT(nullVec("int * _Nullable& (* _Nonnull)()"), + ElementsAre(NullabilityKind::NonNull, NullabilityKind::Nullable)); + EXPECT_THAT(nullVec("int * _Nullable&& (* _Nonnull)()"), + ElementsAre(NullabilityKind::NonNull, NullabilityKind::Nullable)); +} + TEST_F(GetNullabilityAnnotationsFromTypeTest, AliasTemplates) { Preamble = R"cpp( template <typename T> @@ -285,5 +299,13 @@ "float * _Nonnull (* _Nullable)(double * _Nonnull, double *)"); } +TEST_F(PrintWithNullabilityTest, References) { + EXPECT_EQ(print("int * &", {NullabilityKind::Nullable}), "int * _Nullable &"); + EXPECT_EQ(print("int * &&", {NullabilityKind::Nullable}), + "int * _Nullable &&"); + EXPECT_EQ(print("int *& (&&)()", {NullabilityKind::Nullable}), + "int * _Nullable &(&&)()"); +} + } // namespace } // namespace clang::tidy::nullability