[clang] 15a0e32 - [APINotes] Parse function-like Where.Parameters (#203227)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 16 09:06:52 PDT 2026
Author: StoeckOverflow
Date: 2026-06-16T17:06:47+01:00
New Revision: 15a0e321484cdfa94e7d5aab5de9175c3533db04
URL: https://github.com/llvm/llvm-project/commit/15a0e321484cdfa94e7d5aab5de9175c3533db04
DIFF: https://github.com/llvm/llvm-project/commit/15a0e321484cdfa94e7d5aab5de9175c3533db04.diff
LOG: [APINotes] Parse function-like Where.Parameters (#203227)
Add YAML parser/model support for `Where.Parameters` on function-like
API notes entries. This keeps `Name` as the required entry key and
allows top-level `Functions` and C++ `Tags` / `Methods` to parse and
round-trip an optional ordered list of explicit parameter type
spellings.
Binary API notes serialization, lookup, and overload matching are
intentionally left for follow-up patches. Notes using `Where.Parameters`
are diagnosed during binary conversion for now.
Added:
clang/test/APINotes/Inputs/Headers/WhereParametersMapElement.apinotes
clang/test/APINotes/Inputs/Headers/WhereParametersMethodWhereSequence.apinotes
clang/test/APINotes/Inputs/Headers/WhereParametersMissingName.apinotes
clang/test/APINotes/Inputs/Headers/WhereParametersParser.apinotes
clang/test/APINotes/Inputs/Headers/WhereParametersScalar.apinotes
clang/test/APINotes/Inputs/Headers/WhereParametersUnknownWhereKey.apinotes
clang/test/APINotes/Inputs/Headers/WhereParametersWhereSequence.apinotes
clang/test/APINotes/Inputs/WhereParametersConvertDiag/APINotes.apinotes
clang/test/APINotes/Inputs/WhereParametersConvertDiag/WhereParametersConvertDiag.h
clang/test/APINotes/where-parameters-convert-diags.cpp
clang/test/APINotes/where-parameters-yaml.test
Modified:
clang/lib/APINotes/APINotesYAMLCompiler.cpp
Removed:
################################################################################
diff --git a/clang/lib/APINotes/APINotesYAMLCompiler.cpp b/clang/lib/APINotes/APINotesYAMLCompiler.cpp
index 390dd428d55e3..e17549f33d219 100644
--- a/clang/lib/APINotes/APINotesYAMLCompiler.cpp
+++ b/clang/lib/APINotes/APINotesYAMLCompiler.cpp
@@ -338,8 +338,15 @@ template <> struct MappingTraits<Class> {
} // namespace llvm
namespace {
+typedef std::vector<StringRef> WhereParamsSeq;
+
+struct FunctionWhere {
+ std::optional<WhereParamsSeq> Parameters;
+};
+
struct Function {
StringRef Name;
+ std::optional<FunctionWhere> Where;
ParamsSeq Params;
NullabilitySeq Nullability;
std::optional<NullabilityKind> NullabilityOfRet;
@@ -361,9 +368,16 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(Function)
namespace llvm {
namespace yaml {
+template <> struct MappingTraits<FunctionWhere> {
+ static void mapping(IO &IO, FunctionWhere &W) {
+ IO.mapOptional("Parameters", W.Parameters);
+ }
+};
+
template <> struct MappingTraits<Function> {
static void mapping(IO &IO, Function &F) {
IO.mapRequired("Name", F.Name);
+ IO.mapOptional("Where", F.Where);
IO.mapOptional("Parameters", F.Params);
IO.mapOptional("Nullability", F.Nullability);
IO.mapOptional("NullabilityOfRet", F.NullabilityOfRet, std::nullopt);
@@ -1137,6 +1151,11 @@ class YAMLConverter {
}
for (const auto &CXXMethod : T.Methods) {
+ if (CXXMethod.Where) {
+ emitError("'Where' is not supported by binary API notes yet");
+ continue;
+ }
+
CXXMethodInfo MI;
convertFunction(CXXMethod, MI);
Writer.addCXXMethod(TagCtxID, CXXMethod.Name, MI, SwiftVersion);
@@ -1210,6 +1229,11 @@ class YAMLConverter {
// Write all global functions.
llvm::StringSet<> KnownFunctions;
for (const auto &Function : TLItems.Functions) {
+ if (Function.Where) {
+ emitError("'Where' is not supported by binary API notes yet");
+ continue;
+ }
+
// Check for duplicate global functions.
if (!KnownFunctions.insert(Function.Name).second) {
emitError(llvm::Twine("multiple definitions of global function '") +
diff --git a/clang/test/APINotes/Inputs/Headers/WhereParametersMapElement.apinotes b/clang/test/APINotes/Inputs/Headers/WhereParametersMapElement.apinotes
new file mode 100644
index 0000000000000..13d5d0e73378d
--- /dev/null
+++ b/clang/test/APINotes/Inputs/Headers/WhereParametersMapElement.apinotes
@@ -0,0 +1,8 @@
+---
+Name: WhereParametersMapElement
+Functions:
+- Name: makeWidget
+ Where:
+ Parameters:
+ - Type: int
+ SwiftName: makeWidget(_:)
diff --git a/clang/test/APINotes/Inputs/Headers/WhereParametersMethodWhereSequence.apinotes b/clang/test/APINotes/Inputs/Headers/WhereParametersMethodWhereSequence.apinotes
new file mode 100644
index 0000000000000..f55d7c1577b53
--- /dev/null
+++ b/clang/test/APINotes/Inputs/Headers/WhereParametersMethodWhereSequence.apinotes
@@ -0,0 +1,9 @@
+---
+Name: WhereParametersMethodWhereSequence
+Tags:
+- Name: Widget
+ Methods:
+ - Name: setValue
+ Where:
+ - Parameters:
+ - int
diff --git a/clang/test/APINotes/Inputs/Headers/WhereParametersMissingName.apinotes b/clang/test/APINotes/Inputs/Headers/WhereParametersMissingName.apinotes
new file mode 100644
index 0000000000000..dd2ee3ed7fa03
--- /dev/null
+++ b/clang/test/APINotes/Inputs/Headers/WhereParametersMissingName.apinotes
@@ -0,0 +1,7 @@
+---
+Name: WhereParametersMissingName
+Functions:
+- Where:
+ Parameters:
+ - int
+ SwiftName: makeWidget(_:)
diff --git a/clang/test/APINotes/Inputs/Headers/WhereParametersParser.apinotes b/clang/test/APINotes/Inputs/Headers/WhereParametersParser.apinotes
new file mode 100644
index 0000000000000..597bd760c072d
--- /dev/null
+++ b/clang/test/APINotes/Inputs/Headers/WhereParametersParser.apinotes
@@ -0,0 +1,50 @@
+---
+Name: WhereParametersParser
+Functions:
+- Name: makeWidget
+ Where:
+ Parameters:
+ - int
+ SwiftName: makeWidget(_:)
+- Name: makeWidget
+ Where:
+ Parameters:
+ - double
+ - const char *
+ SwiftName: makeWidget(_:_:)
+- Name: currentWidget
+ Where:
+ Parameters: []
+ SwiftName: currentWidget()
+- Name: makeWidget
+ SwiftName: makeWidget(_:)
+- Name: functionWithParameterNotes
+ Parameters:
+ - Position: 0
+ Type: int
+ SwiftName: functionWithParameterNotes(_:)
+Tags:
+- Name: Widget
+ Methods:
+ - Name: setValue
+ Where:
+ Parameters:
+ - int
+ SwiftName: setIntValue(_:)
+ - Name: setValue
+ Where:
+ Parameters:
+ - double
+ - const char *
+ SwiftName: setValue(_:_:)
+ - Name: reset
+ Where:
+ Parameters: []
+ SwiftName: reset()
+ - Name: setValue
+ SwiftName: setValue(_:)
+ - Name: methodWithParameterNotes
+ Parameters:
+ - Position: 0
+ Type: int
+ SwiftName: methodWithParameterNotes(_:)
diff --git a/clang/test/APINotes/Inputs/Headers/WhereParametersScalar.apinotes b/clang/test/APINotes/Inputs/Headers/WhereParametersScalar.apinotes
new file mode 100644
index 0000000000000..e116af3ed28be
--- /dev/null
+++ b/clang/test/APINotes/Inputs/Headers/WhereParametersScalar.apinotes
@@ -0,0 +1,7 @@
+---
+Name: WhereParametersScalar
+Functions:
+- Name: makeWidget
+ Where:
+ Parameters: int
+ SwiftName: makeWidget(_:)
diff --git a/clang/test/APINotes/Inputs/Headers/WhereParametersUnknownWhereKey.apinotes b/clang/test/APINotes/Inputs/Headers/WhereParametersUnknownWhereKey.apinotes
new file mode 100644
index 0000000000000..55d676400c23c
--- /dev/null
+++ b/clang/test/APINotes/Inputs/Headers/WhereParametersUnknownWhereKey.apinotes
@@ -0,0 +1,7 @@
+---
+Name: WhereParametersUnknownWhereKey
+Functions:
+- Name: makeWidget
+ Where:
+ ResultType: int
+ SwiftName: makeWidget(_:)
diff --git a/clang/test/APINotes/Inputs/Headers/WhereParametersWhereSequence.apinotes b/clang/test/APINotes/Inputs/Headers/WhereParametersWhereSequence.apinotes
new file mode 100644
index 0000000000000..3ba8a5295e29b
--- /dev/null
+++ b/clang/test/APINotes/Inputs/Headers/WhereParametersWhereSequence.apinotes
@@ -0,0 +1,8 @@
+---
+Name: WhereParametersWhereSequence
+Functions:
+- Name: makeWidget
+ Where:
+ - Parameters:
+ - int
+ SwiftName: makeWidget(_:)
diff --git a/clang/test/APINotes/Inputs/WhereParametersConvertDiag/APINotes.apinotes b/clang/test/APINotes/Inputs/WhereParametersConvertDiag/APINotes.apinotes
new file mode 100644
index 0000000000000..c1eca20d96e89
--- /dev/null
+++ b/clang/test/APINotes/Inputs/WhereParametersConvertDiag/APINotes.apinotes
@@ -0,0 +1,8 @@
+---
+Name: WhereParametersConvertDiag
+Tags:
+- Name: Widget
+ Methods:
+ - Name: reset
+ Where: {}
+ SwiftName: reset()
diff --git a/clang/test/APINotes/Inputs/WhereParametersConvertDiag/WhereParametersConvertDiag.h b/clang/test/APINotes/Inputs/WhereParametersConvertDiag/WhereParametersConvertDiag.h
new file mode 100644
index 0000000000000..32dc081bfc036
--- /dev/null
+++ b/clang/test/APINotes/Inputs/WhereParametersConvertDiag/WhereParametersConvertDiag.h
@@ -0,0 +1,8 @@
+#ifndef WHERE_PARAMETERS_CONVERT_DIAG_H
+#define WHERE_PARAMETERS_CONVERT_DIAG_H
+
+struct Widget {
+ void reset();
+};
+
+#endif // WHERE_PARAMETERS_CONVERT_DIAG_H
diff --git a/clang/test/APINotes/where-parameters-convert-diags.cpp b/clang/test/APINotes/where-parameters-convert-diags.cpp
new file mode 100644
index 0000000000000..ee40efeaa865b
--- /dev/null
+++ b/clang/test/APINotes/where-parameters-convert-diags.cpp
@@ -0,0 +1,5 @@
+// RUN: not %clang_cc1 -fsyntax-only -fapinotes %s -I %S/Inputs/WhereParametersConvertDiag 2>&1 | FileCheck %s
+
+#include "WhereParametersConvertDiag.h"
+
+// CHECK: error: 'Where' is not supported by binary API notes yet
diff --git a/clang/test/APINotes/where-parameters-yaml.test b/clang/test/APINotes/where-parameters-yaml.test
new file mode 100644
index 0000000000000..8a0a7544fa1b7
--- /dev/null
+++ b/clang/test/APINotes/where-parameters-yaml.test
@@ -0,0 +1,56 @@
+RUN: apinotes-test %S/Inputs/Headers/WhereParametersParser.apinotes | FileCheck %s
+RUN: apinotes-test %S/Inputs/Headers/WhereParametersMissingName.apinotes 2>&1 | FileCheck %s --check-prefix=MISSING-NAME
+RUN: apinotes-test %S/Inputs/Headers/WhereParametersWhereSequence.apinotes 2>&1 | FileCheck %s --check-prefix=WHERE-SEQUENCE
+RUN: apinotes-test %S/Inputs/Headers/WhereParametersScalar.apinotes 2>&1 | FileCheck %s --check-prefix=PARAMETERS-SCALAR
+RUN: apinotes-test %S/Inputs/Headers/WhereParametersMapElement.apinotes 2>&1 | FileCheck %s --check-prefix=PARAMETERS-MAP-ELEMENT
+RUN: apinotes-test %S/Inputs/Headers/WhereParametersUnknownWhereKey.apinotes 2>&1 | FileCheck %s --check-prefix=UNKNOWN-WHERE-KEY
+RUN: apinotes-test %S/Inputs/Headers/WhereParametersMethodWhereSequence.apinotes 2>&1 | FileCheck %s --check-prefix=METHOD-WHERE-SEQUENCE
+
+CHECK: Name: WhereParametersParser
+CHECK: Functions:
+CHECK: - Name: makeWidget
+CHECK-NEXT: Where:
+CHECK-NEXT: Parameters:
+CHECK-NEXT: - int
+CHECK: - Name: makeWidget
+CHECK-NEXT: Where:
+CHECK-NEXT: Parameters:
+CHECK-NEXT: - double
+CHECK-NEXT: - 'const char *'
+CHECK: - Name: currentWidget
+CHECK-NEXT: Where:
+CHECK-NEXT: Parameters: []
+CHECK: - Name: makeWidget
+CHECK-NEXT: SwiftName: 'makeWidget(_:)'
+CHECK: - Name: functionWithParameterNotes
+CHECK-NEXT: Parameters:
+CHECK-NEXT: - Position: 0
+CHECK-NEXT: Type: int
+CHECK: Tags:
+CHECK: - Name: Widget
+CHECK: Methods:
+CHECK: - Name: setValue
+CHECK-NEXT: Where:
+CHECK-NEXT: Parameters:
+CHECK-NEXT: - int
+CHECK: - Name: setValue
+CHECK-NEXT: Where:
+CHECK-NEXT: Parameters:
+CHECK-NEXT: - double
+CHECK-NEXT: - 'const char *'
+CHECK: - Name: reset
+CHECK-NEXT: Where:
+CHECK-NEXT: Parameters: []
+CHECK: - Name: setValue
+CHECK-NEXT: SwiftName: 'setValue(_:)'
+CHECK: - Name: methodWithParameterNotes
+CHECK-NEXT: Parameters:
+CHECK-NEXT: - Position: 0
+CHECK-NEXT: Type: int
+
+MISSING-NAME: missing required key 'Name'
+WHERE-SEQUENCE: not a mapping
+PARAMETERS-SCALAR: not a sequence
+PARAMETERS-MAP-ELEMENT: unexpected scalar
+UNKNOWN-WHERE-KEY: unknown key 'ResultType'
+METHOD-WHERE-SEQUENCE: not a mapping
More information about the cfe-commits
mailing list