[clang] [APINotes] Fix fatal error when using the Type key on fields (PR #180672)
Hunter Baker via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 9 20:16:41 PST 2026
https://github.com/literally-anything created https://github.com/llvm/llvm-project/pull/180672
This fixes a clang crash when importing a module with apinotes that sets the Type key on a Field:
```
# .---command stderr------------
# | API notes allowed a type on an unknown declaration
# | UNREACHABLE executed at <path>/llvm-project/clang/lib/Sema/SemaAPINotes.cpp:419!
# | PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
# | Stack dump:
# | 0. <path>/llvm-project/clang/test/APINotes/Inputs/Headers/Fields.h:4:12: current parser token ';'
# | 1. <path>/llvm-project/clang/test/APINotes/Inputs/Headers/Fields.h:3:1: parsing struct/union/class body 'IntWrapper'
...
# | #8 0x0000000109540868 clang::Sema::ApplyAPINotesType(clang::Decl*, llvm::StringRef)
# | #9 0x000000010955c6ec applyAPINotesType(clang::Sema&, clang::Decl*, llvm::StringRef, (anonymous namespace)::VersionedInfoMetadata)
```
```yaml
Tags:
- Name: IntWrapper
Fields:
- Name: value
Type: ValueType # Fails because of this
```
Previously, the case that the Decl passed to `ApplyAPINotesType` could be a `FieldDecl` was overlooked.
```cpp
struct Field {
…
StringRef Type;
...
}
...
template <> struct MappingTraits<Field> {
static void mapping(IO &IO, Field &F) {
…
IO.mapOptional("Type", F.Type, StringRef("")); // ‘Type' is already a valid key in apinotes files.
….
}
}
```
This adds the case to handle `FieldDecl`s.
@egorzhdan @compnerd
>From 8a1a7a1057bb96b177b91bd7ef5bfc3f7a8bd525 Mon Sep 17 00:00:00 2001
From: Hunter Baker <62899372+literally-anything at users.noreply.github.com>
Date: Mon, 9 Feb 2026 22:55:30 -0500
Subject: [PATCH 1/2] [APINotes] Fix fatal error when using Type key on
FieldDecl
When using a Type key on fields of structs or clases, clang hits a fatal error: "llvm_unreachable("API notes allowed a type on an unknown declaration")".
This commit fixes that by adding the missing case to the if statement for FieldDecl.
---
clang/lib/Sema/SemaAPINotes.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/clang/lib/Sema/SemaAPINotes.cpp b/clang/lib/Sema/SemaAPINotes.cpp
index 059eb0dd767b7..12929895b3789 100644
--- a/clang/lib/Sema/SemaAPINotes.cpp
+++ b/clang/lib/Sema/SemaAPINotes.cpp
@@ -409,6 +409,12 @@ void Sema::ApplyAPINotesType(Decl *D, StringRef TypeString) {
property->getType(), Type)) {
property->setType(Type, TypeInfo);
}
+ } else if (auto field = dyn_cast<FieldDecl>(D)) {
+ if (!checkAPINotesReplacementType(*this, field->getLocation(),
+ field->getType(), Type)) {
+ field->setType(Type);
+ field->setTypeSourceInfo(TypeInfo);
+ }
} else {
llvm_unreachable("API notes allowed a type on an unknown declaration");
}
>From 2e8222605f89d8afbd24a8eddd44152604ce0795 Mon Sep 17 00:00:00 2001
From: Hunter Baker <62899372+literally-anything at users.noreply.github.com>
Date: Mon, 9 Feb 2026 23:01:31 -0500
Subject: [PATCH 2/2] [APINotes] Add test for Type key struct fields
---
clang/test/APINotes/Inputs/Headers/Fields.apinotes | 1 +
clang/test/APINotes/Inputs/Headers/Fields.h | 2 ++
clang/test/APINotes/fields.cpp | 2 +-
3 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/clang/test/APINotes/Inputs/Headers/Fields.apinotes b/clang/test/APINotes/Inputs/Headers/Fields.apinotes
index 931da52ba29d1..44545ab8c7d27 100644
--- a/clang/test/APINotes/Inputs/Headers/Fields.apinotes
+++ b/clang/test/APINotes/Inputs/Headers/Fields.apinotes
@@ -4,6 +4,7 @@ Tags:
- Name: IntWrapper
Fields:
- Name: value
+ Type: ValueType
Availability: none
AvailabilityMsg: "oh no"
- Name: Outer
diff --git a/clang/test/APINotes/Inputs/Headers/Fields.h b/clang/test/APINotes/Inputs/Headers/Fields.h
index dbd342da47789..cc2bc5814c00a 100644
--- a/clang/test/APINotes/Inputs/Headers/Fields.h
+++ b/clang/test/APINotes/Inputs/Headers/Fields.h
@@ -1,3 +1,5 @@
+enum class ValueType {};
+
struct IntWrapper {
int value;
diff --git a/clang/test/APINotes/fields.cpp b/clang/test/APINotes/fields.cpp
index 8dea2229b4e0a..1522f098634cd 100644
--- a/clang/test/APINotes/fields.cpp
+++ b/clang/test/APINotes/fields.cpp
@@ -6,7 +6,7 @@
#include "Fields.h"
// CHECK-FIELD: Dumping IntWrapper::value:
-// CHECK-FIELD-NEXT: FieldDecl {{.+}} value
+// CHECK-FIELD-NEXT: FieldDecl {{.+}} value 'ValueType'
// CHECK-FIELD: UnavailableAttr {{.+}} <<invalid sloc>> "oh no"
// CHECK-DEEP-FIELD: Dumping Outer::Inner::value:
More information about the cfe-commits
mailing list