Skip to content

Commit ae62d75

Browse files
authored
Prevent GSL_SUPPRESS arguments from being modified by clang-format (microsoft#17242)
Prevent `GSL_SUPPRESS` arguments from being modified by clang-format and update existing usages. clang-format was changing something like `GSL_SUPPRESS(r.11)` to `GSL_SUPPRESS(r .11)`. For some compilers (e.g., clang), the `gsl::suppress` attribute takes a quoted string argument. We don't want to insert spaces there.
1 parent 4b3477f commit ae62d75

File tree

17 files changed

+53
-59
lines changed

17 files changed

+53
-59
lines changed

.clang-format

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ BasedOnStyle: Google
77
ColumnLimit: 0
88
SortIncludes: false
99
DerivePointerAlignment: false
10+
# Avoid adding spaces between tokens in GSL_SUPPRESS arguments.
11+
# E.g., don't change "GSL_SUPPRESS(r.11)" to "GSL_SUPPRESS(r .11)".
12+
WhitespaceSensitiveMacros: ["GSL_SUPPRESS"]
1013

1114
# if you want to customize when working locally see https://clang.llvm.org/docs/ClangFormatStyleOptions.html for options.
1215
# See ReformatSource.ps1 for a script to update all source according to the current options in this file.

include/onnxruntime/core/common/logging/capture.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class Capture {
7777

7878
char SeverityPrefix() const noexcept {
7979
// Carefully setup so severity_ is a valid index
80-
GSL_SUPPRESS(bounds .2) {
80+
GSL_SUPPRESS(bounds.2) {
8181
return logging::SEVERITY_PREFIX[static_cast<int>(severity_)];
8282
}
8383
}

include/onnxruntime/core/common/narrow.h

+5-13
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,13 @@ namespace detail {
3535

3636
// narrow() : a checked version of narrow_cast() that terminates if the cast changed the value
3737
template <class T, class U, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr>
38-
// clang-format off
39-
GSL_SUPPRESS(type.1) // NO-FORMAT: attribute
40-
// clang-format on
41-
constexpr T narrow(U u) noexcept {
38+
GSL_SUPPRESS(type.1) constexpr T narrow(U u) noexcept {
4239
constexpr const bool is_different_signedness =
4340
(std::is_signed<T>::value != std::is_signed<U>::value);
4441

45-
// clang-format off
46-
GSL_SUPPRESS(es.103) // NO-FORMAT: attribute // don't overflow
47-
GSL_SUPPRESS(es.104) // NO-FORMAT: attribute // don't underflow
48-
GSL_SUPPRESS(p.2) // NO-FORMAT: attribute // don't rely on undefined behavior
49-
// clang-format on
42+
GSL_SUPPRESS(es.103) // don't overflow
43+
GSL_SUPPRESS(es.104) // don't underflow
44+
GSL_SUPPRESS(p.2) // don't rely on undefined behavior
5045
const T t = gsl::narrow_cast<T>(u); // While this is technically undefined behavior in some cases (i.e., if the source value is of floating-point type
5146
// and cannot fit into the destination integral type), the resultant behavior is benign on the platforms
5247
// that we target (i.e., no hardware trap representations are hit).
@@ -59,10 +54,7 @@ GSL_SUPPRESS(p.2) // NO-FORMAT: attribute // don't rely on undefined behavior
5954
}
6055

6156
template <class T, class U, typename std::enable_if<!std::is_arithmetic<T>::value>::type* = nullptr>
62-
// clang-format off
63-
GSL_SUPPRESS(type.1) // NO-FORMAT: attribute
64-
// clang-format on
65-
constexpr T narrow(U u) noexcept {
57+
GSL_SUPPRESS(type.1) constexpr T narrow(U u) noexcept {
6658
const T t = gsl::narrow_cast<T>(u);
6759

6860
if (static_cast<U>(t) != u) {

include/onnxruntime/core/common/status.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ class [[nodiscard]] Status {
121121

122122
Status(StatusCategory category, int code);
123123

124-
GSL_SUPPRESS(r .11)
124+
GSL_SUPPRESS(r.11)
125125
Status(const Status& other)
126126
: state_((other.state_ == nullptr) ? nullptr : new State(*other.state_)) {}
127-
GSL_SUPPRESS(r .11)
127+
GSL_SUPPRESS(r.11)
128128
Status& operator=(const Status& other) {
129129
if (state_ != other.state_) {
130130
if (other.state_ == nullptr) {

onnxruntime/contrib_ops/cuda/bert/tensorrt_fused_multihead_attention/flash_attention/sharedCubinLoader.h

+3-4
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,10 @@ class TSharedCubinKernelFactory {
166166
auto const id = hashID(type, sm);
167167
auto const findIter = mKernels.find(id);
168168
if (findIter == mKernels.end()) {
169-
GSL_SUPPRESS(r .11)
170-
auto* newKernel = new TKernelList{pKernelList, nbKernels, type, sm};
169+
auto newKernel = std::make_unique<TKernelList>(pKernelList, nbKernels, type, sm);
171170
newKernel->loadCubinKernels();
172-
mKernels.insert(std::make_pair(id, std::unique_ptr<TKernelList>(newKernel)));
173-
return newKernel;
171+
auto const insert_result = mKernels.insert(std::make_pair(id, std::move(newKernel)));
172+
return insert_result.first->second.get();
174173
}
175174
return findIter->second.get();
176175
}

onnxruntime/core/graph/graph.cc

+8-8
Original file line numberDiff line numberDiff line change
@@ -1124,7 +1124,7 @@ void Node::ForEachDef(std::function<void(const onnxruntime::NodeArg&, bool is_in
11241124
// Version ir_version,
11251125
// std::unique_ptr<Graph>& new_graph) {
11261126
// // create instance. need to call private ctor so can't use make_unique
1127-
// GSL_SUPPRESS(r .11)
1127+
// GSL_SUPPRESS(r.11)
11281128
// new_graph.reset(new Graph(nullptr, &graph_proto, domain_to_version, ir_version));
11291129
//
11301130
// // as we just loaded from file we want to fully initialize/Resolve, but not let that change
@@ -1566,7 +1566,7 @@ void Graph::RemoveEdge(NodeIndex src_node_index, NodeIndex dst_node_index, int s
15661566
#endif // !defined(ORT_MINIMAL_BUILD) || defined(ORT_EXTENDED_MINIMAL_BUILD)
15671567

15681568
#if !defined(ORT_MINIMAL_BUILD)
1569-
GSL_SUPPRESS(es .84) // ignoring return value from unordered_map::insert causes noisy complaint
1569+
GSL_SUPPRESS(es.84) // ignoring return value from unordered_map::insert causes noisy complaint
15701570
Status Graph::BuildConnections(std::unordered_set<std::string>& outer_scope_node_args_consumed) {
15711571
// recurse into subgraphs first so we can update any nodes in this graph that are used by those subgraphs
15721572
if (!resolve_context_.nodes_with_subgraphs.empty()) {
@@ -1845,7 +1845,7 @@ void Graph::KahnsTopologicalSort(const std::function<void(const Node*)>& enter,
18451845
}
18461846
}
18471847

1848-
GSL_SUPPRESS(es .84) // noisy warning about ignoring return value from insert(...)
1848+
GSL_SUPPRESS(es.84) // noisy warning about ignoring return value from insert(...)
18491849
Status Graph::PerformTopologicalSortAndCheckIsAcyclic() {
18501850
nodes_in_topological_order_.clear();
18511851
std::unordered_set<NodeIndex> downstream_nodes; // nodes downstream of the node we're currently checking
@@ -2209,7 +2209,7 @@ Status Graph::UpdateShapeInference(Node& node) {
22092209
}
22102210

22112211
// Implementation of type-inference and type-checking for a single node
2212-
GSL_SUPPRESS(f .23) // spurious warning about inferred_type never being checked for null
2212+
GSL_SUPPRESS(f.23) // spurious warning about inferred_type never being checked for null
22132213
Status Graph::InferAndVerifyTypeMatch(Node& node, const OpSchema& op, const ResolveOptions& options) {
22142214
auto& node_name = node.Name();
22152215

@@ -2650,7 +2650,7 @@ Status Graph::VerifyInputAndInitializerNames() {
26502650
}
26512651

26522652
for (auto& initializer_pair : name_to_initial_tensor_) {
2653-
GSL_SUPPRESS(es .84)
2653+
GSL_SUPPRESS(es.84)
26542654
inputs_and_initializers.insert(initializer_pair.first);
26552655
// Initializers are expected to be included in inputs (according to ONNX spec).
26562656
// onnxruntime relaxes this constraint. No duplicate-name check here.
@@ -3314,7 +3314,7 @@ bool Graph::AddControlEdge(NodeIndex src_node_index, NodeIndex dst_node_index) {
33143314
return false;
33153315
}
33163316

3317-
GSL_SUPPRESS(es .84) { // ignoring return from insert()
3317+
GSL_SUPPRESS(es.84) { // ignoring return from insert()
33183318
nodes_[src_node_index]->MutableRelationships().output_edges.insert(Node::EdgeEnd(*nodes_[dst_node_index]));
33193319
nodes_[dst_node_index]->MutableRelationships().input_edges.insert(Node::EdgeEnd(*nodes_[src_node_index]));
33203320
nodes_[dst_node_index]->MutableRelationships().control_inputs.insert(nodes_[src_node_index]->Name());
@@ -3651,7 +3651,7 @@ void Graph::ComputeOverridableInitializers() {
36513651

36523652
#if !defined(ORT_MINIMAL_BUILD)
36533653

3654-
GSL_SUPPRESS(es .84) // warning about ignoring return value from insert(...)
3654+
GSL_SUPPRESS(es.84) // warning about ignoring return value from insert(...)
36553655
Status Graph::SetGraphInputsOutputs() {
36563656
// If loaded from a model file, we start from the specified inputs and
36573657
// outputs set earlier by InitializeStateFromModelFileGraphProto().
@@ -3837,7 +3837,7 @@ Status Graph::PopulateNodeArgToProducerConsumerLookupsFromNodes() {
38373837
}
38383838

38393839
// calling private ctor
3840-
GSL_SUPPRESS(r .11)
3840+
GSL_SUPPRESS(r.11)
38413841
gsl::not_null<Node*> Graph::AllocateNode() {
38423842
ORT_ENFORCE(nodes_.size() < static_cast<unsigned int>(std::numeric_limits<int>::max()));
38433843
std::unique_ptr<Node> new_node(new Node(nodes_.size(), *this));

onnxruntime/core/graph/model.cc

+9-9
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ Model::Model(const std::string& graph_name,
115115
}
116116

117117
// need to call private ctor so can't use make_shared
118-
GSL_SUPPRESS(r .11)
118+
GSL_SUPPRESS(r.11)
119119
graph_.reset(new Graph(*this, model_proto_.mutable_graph(), *p_domain_to_version, IrVersion(), schema_registry,
120120
logger, options.strict_shape_type_inference));
121121
}
@@ -238,7 +238,7 @@ Model::Model(ModelProto&& model_proto, const PathString& model_path,
238238
}
239239

240240
// create instance. need to call private ctor so can't use make_unique
241-
GSL_SUPPRESS(r .11)
241+
GSL_SUPPRESS(r.11)
242242
graph_.reset(new Graph(*this, model_proto_.mutable_graph(), domain_to_version, IrVersion(), schema_registry,
243243
logger, options.strict_shape_type_inference));
244244
}
@@ -390,7 +390,7 @@ Status Model::Load(const ModelProto& model_proto,
390390
}
391391

392392
// need to call private ctor so can't use make_shared
393-
GSL_SUPPRESS(r .11)
393+
GSL_SUPPRESS(r.11)
394394

395395
auto status = Status::OK();
396396
ORT_TRY {
@@ -430,7 +430,7 @@ Status Model::Load(ModelProto&& model_proto,
430430
}
431431

432432
// need to call private ctor so can't use make_shared
433-
GSL_SUPPRESS(r .11)
433+
GSL_SUPPRESS(r.11)
434434
auto status = Status::OK();
435435
ORT_TRY {
436436
model = std::make_unique<Model>(std::move(model_proto), model_path, local_registries, logger, options);
@@ -477,7 +477,7 @@ static Status LoadModelHelper(const T& file_path, Loader loader) {
477477
}
478478

479479
if (!status.IsOK()) {
480-
GSL_SUPPRESS(es .84)
480+
GSL_SUPPRESS(es.84)
481481
ORT_IGNORE_RETURN_VALUE(Env::Default().FileClose(fd));
482482
return status;
483483
}
@@ -550,7 +550,7 @@ static Status SaveModel(Model& model, const T& file_path) {
550550
});
551551
}
552552
if (!status.IsOK()) {
553-
GSL_SUPPRESS(es .84)
553+
GSL_SUPPRESS(es.84)
554554
ORT_IGNORE_RETURN_VALUE(Env::Default().FileClose(fd));
555555
return status;
556556
}
@@ -583,7 +583,7 @@ static Status SaveModelWithExternalInitializers(Model& model,
583583
});
584584
}
585585
if (!status.IsOK()) {
586-
GSL_SUPPRESS(es .84)
586+
GSL_SUPPRESS(es.84)
587587
ORT_IGNORE_RETURN_VALUE(Env::Default().FileClose(fd));
588588
return status;
589589
}
@@ -595,8 +595,8 @@ Status Model::Load(const PathString& file_path,
595595
return LoadModel(file_path, model_proto);
596596
}
597597

598-
GSL_SUPPRESS(r .30) // spurious warnings. p_model is potentially reset in the internal call to Load
599-
GSL_SUPPRESS(r .35)
598+
GSL_SUPPRESS(r.30) // spurious warnings. p_model is potentially reset in the internal call to Load
599+
GSL_SUPPRESS(r.35)
600600
Status Model::Load(const PathString& file_path, std::shared_ptr<Model>& p_model,
601601
const IOnnxRuntimeOpSchemaRegistryList* local_registries,
602602
const logging::Logger& logger, const ModelOptions& options) {

onnxruntime/core/graph/schema_registry.cc

+5-5
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ common::Status OnnxRuntimeOpSchemaRegistry::RegisterOpSchemaInternal(ONNX_NAMESP
9999
<< "than the operator set version " << ver_range_it->second.opset_version << std::endl;
100100
return common::Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, ostream.str());
101101
}
102-
GSL_SUPPRESS(es .84)
102+
GSL_SUPPRESS(es.84)
103103
map_[op_name][op_domain].emplace(std::make_pair(ver, op_schema));
104104
return common::Status::OK();
105105
}
@@ -172,7 +172,7 @@ void SchemaRegistryManager::GetDomainToVersionMapForRegistries(DomainToVersionMa
172172
// If the map doesn't yet contain this domain, insert it with this registry's value.
173173
// Otherwise, merge the existing range in the map.
174174
if (iter == domain_version_map.end()) {
175-
GSL_SUPPRESS(es .84)
175+
GSL_SUPPRESS(es.84)
176176
domain_version_map.insert(local_domain);
177177
} else {
178178
iter->second = std::max(iter->second, local_domain.second);
@@ -194,7 +194,7 @@ DomainToVersionMap SchemaRegistryManager::GetLastReleasedOpsetVersions(bool is_o
194194
continue;
195195
auto it = domain_version_map.find(domain.first);
196196
if (it == domain_version_map.end()) {
197-
GSL_SUPPRESS(es .84)
197+
GSL_SUPPRESS(es.84)
198198
domain_version_map.insert(std::make_pair(domain.first, domain.second));
199199
} else {
200200
it->second = std::max(it->second, domain.second);
@@ -217,7 +217,7 @@ DomainToVersionMap SchemaRegistryManager::GetLatestOpsetVersions(bool is_onnx_on
217217
continue;
218218
auto it = domain_version_map.find(domain.first);
219219
if (it == domain_version_map.end()) {
220-
GSL_SUPPRESS(es .84)
220+
GSL_SUPPRESS(es.84)
221221
domain_version_map.insert(std::make_pair(domain.first, domain.second.second));
222222
} else {
223223
it->second = std::max(it->second, domain.second.second);
@@ -271,7 +271,7 @@ void SchemaRegistryManager::GetSchemaAndHistory(
271271
}
272272

273273
if (new_version < version) {
274-
GSL_SUPPRESS(es .84)
274+
GSL_SUPPRESS(es.84)
275275
unchecked_registry_indices.insert(unchecked_registry_indices.end(),
276276
checked_registry_indices.begin(),
277277
checked_registry_indices.end());

onnxruntime/core/platform/posix/logging/syslog_sink.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ void SysLogSink::SendImpl(const Timestamp& timestamp, const std::string& logger_
2020
msg << timestamp << " [" << message.SeverityPrefix() << ":" << message.Category() << ":" << logger_id << ", "
2121
<< message.Location().ToString() << "] " << message.Message();
2222

23-
GSL_SUPPRESS(bounds .2) {
23+
GSL_SUPPRESS(bounds.2) {
2424
syslog(SYSLOG_LEVEL[static_cast<int>(message.Severity())] - '0', "%s", msg.str().c_str());
2525
}
2626
}
2727

2828
} // namespace logging
29-
} // namespace onnxruntime
29+
} // namespace onnxruntime

onnxruntime/core/platform/windows/env.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ Status WindowsEnv::MapFileIntoMemory(_In_z_ const ORTCHAR_T* file_path,
431431
0,
432432
static_cast<DWORD>(mapped_offset),
433433
mapped_length);
434-
GSL_SUPPRESS(r .11)
434+
GSL_SUPPRESS(r.11)
435435
mapped_memory =
436436
MappedMemoryPtr{reinterpret_cast<char*>(mapped_base) + offset_to_page,
437437
OrtCallbackInvoker{OrtCallback{UnmapFile, new UnmapFileParam{mapped_base, mapped_length}}}};

onnxruntime/core/providers/cpu/activation/activations.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ struct Softplus : public ElementWiseRangedTransform<T> {
8484
Status Init(const onnxruntime::NodeAttributes&) {
8585
return Status::OK();
8686
}
87-
GSL_SUPPRESS(r .11)
87+
GSL_SUPPRESS(r.11)
8888
ElementWiseRangedTransform<T>* Copy() const {
8989
using T1 = typename std::remove_pointer<decltype(this)>::type;
9090
using T2 = typename std::remove_const<T1>::type;
@@ -107,7 +107,7 @@ struct Relu : public ElementWiseRangedTransform<T> {
107107
Status Init(const onnxruntime::NodeAttributes&) {
108108
return Status::OK();
109109
}
110-
GSL_SUPPRESS(r .11)
110+
GSL_SUPPRESS(r.11)
111111
ElementWiseRangedTransform<T>* Copy() const { // replace it with a macro. why this?
112112
using T1 = typename std::remove_pointer<decltype(this)>::type;
113113
using T2 = typename std::remove_const<T1>::type; // redundant?
@@ -130,7 +130,7 @@ struct Sigmoid : public ElementWiseRangedTransform<T> {
130130
Status Init(const onnxruntime::NodeAttributes&) {
131131
return Status::OK();
132132
}
133-
GSL_SUPPRESS(r .11)
133+
GSL_SUPPRESS(r.11)
134134
ElementWiseRangedTransform<T>* Copy() const {
135135
using T1 = typename std::remove_pointer<decltype(this)>::type;
136136
using T2 = typename std::remove_const<T1>::type;
@@ -156,7 +156,7 @@ struct Softsign : public ElementWiseRangedTransform<T> {
156156
Status Init(const onnxruntime::NodeAttributes&) {
157157
return Status::OK();
158158
}
159-
GSL_SUPPRESS(r .11)
159+
GSL_SUPPRESS(r.11)
160160
ElementWiseRangedTransform<T>* Copy() const {
161161
using T1 = typename std::remove_pointer<decltype(this)>::type;
162162
using T2 = typename std::remove_const<T1>::type;
@@ -179,7 +179,7 @@ struct Tanh : public ElementWiseRangedTransform<T> {
179179
Status Init(const onnxruntime::NodeAttributes&) {
180180
return Status::OK();
181181
}
182-
GSL_SUPPRESS(r .11)
182+
GSL_SUPPRESS(r.11)
183183
ElementWiseRangedTransform<T>* Copy() const {
184184
using T1 = typename std::remove_pointer<decltype(this)>::type;
185185
using T2 = typename std::remove_const<T1>::type;

onnxruntime/core/providers/cpu/element_wise_ranged_transform.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ ElementWiseRangedTransform<T>::~ElementWiseRangedTransform() {
5656
Status Init(const onnxruntime::NodeAttributes& attributes) { \
5757
return (GetFloatParam(#X, attributes, X)); \
5858
} \
59-
GSL_SUPPRESS(r .11) \
59+
GSL_SUPPRESS(r.11) \
6060
ElementWiseRangedTransform<T>* Copy() const final { \
6161
using T1 = typename std::remove_pointer<decltype(this)>::type; \
6262
using T2 = typename std::remove_const<T1>::type; \
@@ -71,7 +71,7 @@ ElementWiseRangedTransform<T>::~ElementWiseRangedTransform() {
7171
ORT_RETURN_IF_ERROR(GetFloatParam(#Y, attributes, Y)); \
7272
return Status::OK(); \
7373
} \
74-
GSL_SUPPRESS(r .11) \
74+
GSL_SUPPRESS(r.11) \
7575
ElementWiseRangedTransform<T>* Copy() const final { \
7676
using T1 = typename std::remove_pointer<decltype(this)>::type; \
7777
using T2 = typename std::remove_const<T1>::type; \

onnxruntime/core/providers/cpu/fp16/fp16_activations.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct Relu<MLFloat16> : public ElementWiseRangedTransform<MLFloat16> {
1919
Activation.ActivationKind = MlasReluActivation;
2020
return Status::OK();
2121
}
22-
GSL_SUPPRESS(r .11)
22+
GSL_SUPPRESS(r.11)
2323
ElementWiseRangedTransform<MLFloat16>* Copy() const final {
2424
using T1 = typename std::remove_pointer<decltype(this)>::type;
2525
using T2 = typename std::remove_const<T1>::type; // redundant?
@@ -48,7 +48,7 @@ struct LeakyRelu<MLFloat16> : public ElementWiseRangedTransform<MLFloat16> {
4848
Activation.ActivationKind = MlasLeakyReluActivation;
4949
return (GetFloatParam("alpha", attributes, Activation.Parameters.LeakyRelu.alpha));
5050
}
51-
GSL_SUPPRESS(r .11)
51+
GSL_SUPPRESS(r.11)
5252
ElementWiseRangedTransform<MLFloat16>* Copy() const final {
5353
using T1 = typename std::remove_pointer<decltype(this)>::type;
5454
using T2 = typename std::remove_const<T1>::type;

onnxruntime/core/session/abi_session_options.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ onnxruntime::Status OrtSessionOptions::RegisterCustomOpsLibrary(onnxruntime::Pat
6060

6161
ORT_API_STATUS_IMPL(OrtApis::CreateSessionOptions, OrtSessionOptions** out) {
6262
API_IMPL_BEGIN
63-
GSL_SUPPRESS(r .11)
63+
GSL_SUPPRESS(r.11)
6464
*out = new OrtSessionOptions();
6565
return nullptr;
6666
API_IMPL_END
@@ -72,7 +72,7 @@ ORT_API(void, OrtApis::ReleaseSessionOptions, _Frees_ptr_opt_ OrtSessionOptions*
7272

7373
ORT_API_STATUS_IMPL(OrtApis::CloneSessionOptions, const OrtSessionOptions* input, OrtSessionOptions** out) {
7474
API_IMPL_BEGIN
75-
GSL_SUPPRESS(r .11)
75+
GSL_SUPPRESS(r.11)
7676
*out = new OrtSessionOptions(*input);
7777
return nullptr;
7878
API_IMPL_END

0 commit comments

Comments
 (0)