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