Built-in alias templates aren't nullability annotations: don't crash checking
PiperOrigin-RevId: 541550114
diff --git a/nullability/type_nullability.cc b/nullability/type_nullability.cc
index 7493e8d..5ef545e 100644
--- a/nullability/type_nullability.cc
+++ b/nullability/type_nullability.cc
@@ -40,6 +40,7 @@
// user-defined pointer-like types.
std::optional<NullabilityKind> getAliasNullability(const TemplateName& TN) {
if (const auto* TD = TN.getAsTemplateDecl()) {
+ if (!TD->getTemplatedDecl()) return std::nullopt; // BuiltinTemplateDecl
if (const auto* A = TD->getTemplatedDecl()->getAttr<AnnotateAttr>()) {
if (A->getAnnotation() == "Nullable") return NullabilityKind::Nullable;
if (A->getAnnotation() == "Nonnull") return NullabilityKind::NonNull;
diff --git a/nullability/type_nullability_test.cc b/nullability/type_nullability_test.cc
index 844f27d..7f87fc0 100644
--- a/nullability/type_nullability_test.cc
+++ b/nullability/type_nullability_test.cc
@@ -117,6 +117,13 @@
EXPECT_THAT(nullVec("TripleAlias<int *, int *_Nullable, int*>"),
ElementsAre(NullabilityKind::NonNull, NullabilityKind::Nullable,
NullabilityKind::Unspecified));
+
+ Preamble = R"cpp(
+ template <class... Ts>
+ using First = __type_pack_element<0, Ts...>;
+ )cpp";
+ EXPECT_THAT(nullVec("First<int * _Nonnull>"),
+ ElementsAre(NullabilityKind::NonNull));
}
TEST_F(GetNullabilityAnnotationsFromTypeTest, DependentAlias) {