Skip to content

Commit 9c57458

Browse files
committed
Fix index numbering in lifetime dependence
1 parent e60e43c commit 9c57458

18 files changed

+81
-94
lines changed

SwiftCompilerSources/Sources/SIL/FunctionConvention.swift

+1-7
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,8 @@ extension FunctionConvention {
271271
return nil
272272
}
273273

274-
// In Sema's LifetimeDependenceInfo, 'self' is always index zero,
275-
// whether it exists or not. In SILFunctionType, 'self' is the
276-
// last parameter if it exists.
277274
private func bridgedIndex(parameterIndex: Int) -> Int {
278-
if hasSelfParam, parameterIndex == (paramCount - 1) {
279-
return 0
280-
}
281-
return parameterIndex + 1
275+
return parameterIndex
282276
}
283277

284278
public var description: String {

include/swift/AST/LifetimeDependence.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,7 @@ class LifetimeDependenceInfo {
201201
/// Builds LifetimeDependenceInfo from SIL
202202
static std::optional<LifetimeDependenceInfo>
203203
fromTypeRepr(LifetimeDependentReturnTypeRepr *lifetimeDependentRepr,
204-
SmallVectorImpl<SILParameterInfo> &params, bool hasSelfParam,
205-
DeclContext *dc);
204+
SmallVectorImpl<SILParameterInfo> &params, DeclContext *dc);
206205

207206
/// Infer LifetimeDependenceInfo
208207
static std::optional<LifetimeDependenceInfo> infer(AbstractFunctionDecl *afd,

lib/AST/ASTMangler.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -3094,7 +3094,7 @@ void ASTMangler::appendFunctionSignature(AnyFunctionType *fn,
30943094
if (afd->hasImplicitSelfDecl()) {
30953095
auto lifetimeDependenceKind =
30963096
fn->getLifetimeDependenceInfo().getLifetimeDependenceOnParam(
3097-
/*paramIndex*/ 0);
3097+
/*selfIndex*/ afd->getParameters()->size());
30983098
if (lifetimeDependenceKind) {
30993099
appendLifetimeDependenceKind(*lifetimeDependenceKind,
31003100
/*isSelfDependence*/ true);
@@ -3183,7 +3183,7 @@ void ASTMangler::appendFunctionInputType(
31833183
Identifier(), type,
31843184
getParameterFlagsForMangling(param.getParameterFlags(),
31853185
defaultSpecifier),
3186-
lifetimeDependenceInfo.getLifetimeDependenceOnParam(/*paramIndex*/ 1),
3186+
lifetimeDependenceInfo.getLifetimeDependenceOnParam(/*paramIndex*/ 0),
31873187
sig, nullptr);
31883188
break;
31893189
}
@@ -3195,7 +3195,7 @@ void ASTMangler::appendFunctionInputType(
31953195

31963196
default:
31973197
bool isFirstParam = true;
3198-
unsigned paramIndex = 1; /* 0 is reserved for self*/
3198+
unsigned paramIndex = 0;
31993199
for (auto &param : params) {
32003200
// Note that we pass `nullptr` as the `forDecl` argument, since the type
32013201
// of the input is no longer directly the type of the declaration, so we

lib/Sema/LifetimeDependence.cpp

+22-26
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ LifetimeDependenceInfo LifetimeDependenceInfo::getForParamIndex(
104104
AbstractFunctionDecl *afd, unsigned index, LifetimeDependenceKind kind) {
105105
auto *dc = afd->getDeclContext();
106106
auto &ctx = dc->getASTContext();
107-
unsigned capacity = afd->getParameters()->size() + 1;
107+
unsigned capacity = afd->hasImplicitSelfDecl()
108+
? (afd->getParameters()->size() + 1)
109+
: afd->getParameters()->size();
108110
auto indexSubset = IndexSubset::get(ctx, capacity, {index});
109111
if (kind == LifetimeDependenceKind::Scope) {
110112
return LifetimeDependenceInfo{/*inheritLifetimeParamIndices*/ nullptr,
@@ -176,7 +178,9 @@ LifetimeDependenceInfo::fromTypeRepr(AbstractFunctionDecl *afd, Type resultType,
176178
auto &ctx = dc->getASTContext();
177179
auto *mod = afd->getModuleContext();
178180
auto &diags = ctx.Diags;
179-
auto capacity = afd->getParameters()->size() + 1;
181+
auto capacity = afd->hasImplicitSelfDecl()
182+
? (afd->getParameters()->size() + 1)
183+
: afd->getParameters()->size();
180184
auto lifetimeDependentRepr =
181185
cast<LifetimeDependentReturnTypeRepr>(afd->getResultTypeRepr());
182186

@@ -252,7 +256,7 @@ LifetimeDependenceInfo::fromTypeRepr(AbstractFunctionDecl *afd, Type resultType,
252256
for (auto *param : *afd->getParameters()) {
253257
if (param->getParameterName() == specifier.getName()) {
254258
if (updateLifetimeDependenceInfo(
255-
specifier, paramIndex + 1,
259+
specifier, paramIndex,
256260
afd->mapTypeIntoContext(
257261
param->toFunctionParam().getParameterType()),
258262
param->getValueOwnership())) {
@@ -278,17 +282,14 @@ LifetimeDependenceInfo::fromTypeRepr(AbstractFunctionDecl *afd, Type resultType,
278282
diag::lifetime_dependence_invalid_param_index, index);
279283
return std::nullopt;
280284
}
281-
if (index != 0) {
282-
auto param = afd->getParameters()->get(index - 1);
283-
auto ownership = param->getValueOwnership();
284-
auto type = afd->mapTypeIntoContext(
285-
param->toFunctionParam().getParameterType());
286-
if (updateLifetimeDependenceInfo(specifier, index, type, ownership)) {
287-
return std::nullopt;
288-
}
289-
break;
285+
auto param = afd->getParameters()->get(index);
286+
auto ownership = param->getValueOwnership();
287+
auto type =
288+
afd->mapTypeIntoContext(param->toFunctionParam().getParameterType());
289+
if (updateLifetimeDependenceInfo(specifier, index, type, ownership)) {
290+
return std::nullopt;
290291
}
291-
LLVM_FALLTHROUGH;
292+
break;
292293
}
293294
case LifetimeDependenceSpecifier::SpecifierKind::Self: {
294295
if (!afd->hasImplicitSelfDecl()) {
@@ -302,7 +303,7 @@ LifetimeDependenceInfo::fromTypeRepr(AbstractFunctionDecl *afd, Type resultType,
302303
return std::nullopt;
303304
}
304305
if (updateLifetimeDependenceInfo(
305-
specifier, /*selfIndex*/ 0,
306+
specifier, /* selfIndex */ afd->getParameters()->size(),
306307
afd->getImplicitSelfDecl()->getTypeInContext(),
307308
afd->getImplicitSelfDecl()->getValueOwnership())) {
308309
return std::nullopt;
@@ -326,11 +327,10 @@ LifetimeDependenceInfo::fromTypeRepr(AbstractFunctionDecl *afd, Type resultType,
326327
// apis on type and ownership is different in SIL compared to Sema.
327328
std::optional<LifetimeDependenceInfo> LifetimeDependenceInfo::fromTypeRepr(
328329
LifetimeDependentReturnTypeRepr *lifetimeDependentRepr,
329-
SmallVectorImpl<SILParameterInfo> &params, bool hasSelfParam,
330-
DeclContext *dc) {
330+
SmallVectorImpl<SILParameterInfo> &params, DeclContext *dc) {
331331
auto &ctx = dc->getASTContext();
332332
auto &diags = ctx.Diags;
333-
auto capacity = hasSelfParam ? params.size() : params.size() + 1;
333+
auto capacity = params.size(); // SIL parameters include self
334334

335335
SmallBitVector inheritLifetimeParamIndices(capacity);
336336
SmallBitVector scopeLifetimeParamIndices(capacity);
@@ -367,17 +367,12 @@ std::optional<LifetimeDependenceInfo> LifetimeDependenceInfo::fromTypeRepr(
367367
assert(specifier.getSpecifierKind() ==
368368
LifetimeDependenceSpecifier::SpecifierKind::Ordered);
369369
auto index = specifier.getIndex();
370-
if (index > params.size()) {
370+
if (index > capacity) {
371371
diags.diagnose(specifier.getLoc(),
372372
diag::lifetime_dependence_invalid_param_index, index);
373373
return std::nullopt;
374374
}
375-
if (index == 0 && !hasSelfParam) {
376-
diags.diagnose(specifier.getLoc(),
377-
diag::lifetime_dependence_invalid_self_in_static);
378-
return std::nullopt;
379-
}
380-
auto param = index == 0 ? params.back() : params[index - 1];
375+
auto param = params[index];
381376
auto paramConvention = param.getConvention();
382377
if (updateLifetimeDependenceInfo(specifier, index, paramConvention)) {
383378
return std::nullopt;
@@ -451,7 +446,8 @@ LifetimeDependenceInfo::infer(AbstractFunctionDecl *afd, Type resultType) {
451446
diag::lifetime_dependence_invalid_self_ownership);
452447
return std::nullopt;
453448
}
454-
return LifetimeDependenceInfo::getForParamIndex(afd, /*selfIndex*/ 0, kind);
449+
return LifetimeDependenceInfo::getForParamIndex(
450+
afd, /*selfIndex*/ afd->getParameters()->size(), kind);
455451
}
456452

457453
LifetimeDependenceInfo lifetimeDependenceInfo;
@@ -493,7 +489,7 @@ LifetimeDependenceInfo::infer(AbstractFunctionDecl *afd, Type resultType) {
493489
}
494490
candidateParam = param;
495491
lifetimeDependenceInfo =
496-
LifetimeDependenceInfo::getForParamIndex(afd, paramIndex + 1, lifetimeKind);
492+
LifetimeDependenceInfo::getForParamIndex(afd, paramIndex, lifetimeKind);
497493
}
498494

499495
if (!candidateParam && !hasParamError) {

lib/Sema/TypeCheckType.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -4414,8 +4414,7 @@ NeverNullType TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
44144414
dyn_cast<LifetimeDependentReturnTypeRepr>(
44154415
repr->getResultTypeRepr())) {
44164416
lifetimeDependenceInfo = LifetimeDependenceInfo::fromTypeRepr(
4417-
lifetimeDependentTypeRepr, params, extInfoBuilder.hasSelfParam(),
4418-
getDeclContext());
4417+
lifetimeDependentTypeRepr, params, getDeclContext());
44194418
if (lifetimeDependenceInfo.has_value()) {
44204419
extInfoBuilder =
44214420
extInfoBuilder.withLifetimeDependenceInfo(*lifetimeDependenceInfo);

lib/Serialization/Deserialization.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -3645,7 +3645,7 @@ class DeclDeserializer {
36453645
ctor->setParameters(bodyParams);
36463646

36473647
auto lifetimeDependenceInfo =
3648-
MF.maybeReadLifetimeDependenceInfo(bodyParams->size());
3648+
MF.maybeReadLifetimeDependenceInfo(bodyParams->size() + 1);
36493649

36503650
if (lifetimeDependenceInfo.has_value()) {
36513651
ctx.evaluator.cacheOutput(LifetimeDependenceInfoRequest{ctor},
@@ -4221,8 +4221,8 @@ class DeclDeserializer {
42214221
ParameterList *paramList = MF.readParameterList();
42224222
fn->setParameters(paramList);
42234223

4224-
auto lifetimeDependenceInfo =
4225-
MF.maybeReadLifetimeDependenceInfo(paramList->size());
4224+
auto lifetimeDependenceInfo = MF.maybeReadLifetimeDependenceInfo(
4225+
fn->hasImplicitSelfDecl() ? paramList->size() + 1 : paramList->size());
42264226

42274227
if (lifetimeDependenceInfo.has_value()) {
42284228
ctx.evaluator.cacheOutput(LifetimeDependenceInfoRequest{fn},
@@ -7590,8 +7590,7 @@ Expected<Type> DESERIALIZE_TYPE(SIL_FUNCTION_TYPE)(
75907590
if (!patternSubsOrErr)
75917591
return patternSubsOrErr.takeError();
75927592

7593-
auto lifetimeDependenceInfo = MF.maybeReadLifetimeDependenceInfo(
7594-
extInfo.hasSelfParam() ? numParams : numParams + 1);
7593+
auto lifetimeDependenceInfo = MF.maybeReadLifetimeDependenceInfo(numParams);
75957594

75967595
if (lifetimeDependenceInfo.has_value()) {
75977596
extInfo = extInfo.withLifetimeDependenceInfo(*lifetimeDependenceInfo);

lib/Serialization/ModuleFile.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,7 @@ class ModuleFile
10761076
// Reads lifetime dependence specifier from decl if present
10771077
bool maybeReadLifetimeDependenceSpecifier(
10781078
SmallVectorImpl<LifetimeDependenceSpecifier> &specifierList,
1079-
unsigned numDeclParams);
1079+
unsigned numDeclParams, bool hasSelf);
10801080

10811081
/// Reads inlinable body text from \c DeclTypeCursor, if present.
10821082
std::optional<StringRef> maybeReadInlinableBodyText();

test/Parse/explicit_lifetime_dependence_specifiers.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func invalidSpecifier3(_ x: borrowing BufferView) -> dependsOn(*) BufferView { /
128128
}
129129

130130
// TODO: Diagnose using param indices on func decls in sema
131-
func invalidSpecifier4(_ x: borrowing BufferView) -> dependsOn(0) BufferView { // expected-error{{invalid lifetime dependence specifier on non-existent self}}
131+
func invalidSpecifier4(_ x: borrowing BufferView) -> dependsOn(self) BufferView { // expected-error{{invalid lifetime dependence specifier on non-existent self}}
132132
return BufferView(x.ptr)
133133
}
134134

test/SIL/Parser/lifetime_dependence.sil

+6-6
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ bb0(%0 : $UnsafeRawBufferPointer, %1 : $@thin BufferView.Type):
3131
return %8 : $BufferView
3232
}
3333

34-
// CHECK-LABEL: sil hidden @bufferviewtest2 : $@convention(method) (UnsafeRawBufferPointer, @guaranteed Array<Int>, @thin BufferView.Type) -> _scope(2) @owned BufferView {
35-
sil hidden @bufferviewtest2 : $@convention(method) (UnsafeRawBufferPointer, @guaranteed Array<Int>, @thin BufferView.Type) -> _scope(2) @owned BufferView {
34+
// CHECK-LABEL: sil hidden @bufferviewtest2 : $@convention(method) (UnsafeRawBufferPointer, @guaranteed Array<Int>, @thin BufferView.Type) -> _scope(1) @owned BufferView {
35+
sil hidden @bufferviewtest2 : $@convention(method) (UnsafeRawBufferPointer, @guaranteed Array<Int>, @thin BufferView.Type) -> _scope(1) @owned BufferView {
3636
bb0(%0 : $UnsafeRawBufferPointer, %1 : @noImplicitCopy $Array<Int>, %2 : $@thin BufferView.Type):
3737
%3 = alloc_stack [var_decl] $BufferView, var, name "self"
3838
%6 = begin_access [modify] [static] %3 : $*BufferView
@@ -45,8 +45,8 @@ bb0(%0 : $UnsafeRawBufferPointer, %1 : @noImplicitCopy $Array<Int>, %2 : $@thin
4545
return %10 : $BufferView
4646
}
4747

48-
// CHECK-LABEL: sil hidden @derive : $@convention(thin) (@guaranteed BufferView) -> _scope(1) @owned BufferView {
49-
sil hidden @derive : $@convention(thin) (@guaranteed BufferView) -> _scope(1) @owned BufferView {
48+
// CHECK-LABEL: sil hidden @derive : $@convention(thin) (@guaranteed BufferView) -> _scope(0) @owned BufferView {
49+
sil hidden @derive : $@convention(thin) (@guaranteed BufferView) -> _scope(0) @owned BufferView {
5050
bb0(%0 : @noImplicitCopy $BufferView):
5151
%2 = metatype $@thin BufferView.Type
5252
%3 = struct_extract %0 : $BufferView, #BufferView.ptr
@@ -55,8 +55,8 @@ bb0(%0 : @noImplicitCopy $BufferView):
5555
return %5 : $BufferView
5656
}
5757

58-
// CHECK-LABEL: sil hidden @consumeAndCreate : $@convention(thin) (@owned BufferView) -> _inherit(1) @owned BufferView {
59-
sil hidden @consumeAndCreate : $@convention(thin) (@owned BufferView) -> _inherit(1) @owned BufferView {
58+
// CHECK-LABEL: sil hidden @consumeAndCreate : $@convention(thin) (@owned BufferView) -> _inherit(0) @owned BufferView {
59+
sil hidden @consumeAndCreate : $@convention(thin) (@owned BufferView) -> _inherit(0) @owned BufferView {
6060
bb0(%0 : @noImplicitCopy @_eagerMove $BufferView):
6161
%1 = alloc_stack [var_decl] [moveable_value_debuginfo] $BufferView, var, name "x"
6262
%2 = struct_extract %0 : $BufferView, #BufferView.ptr

test/SIL/explicit_lifetime_dependence_specifiers.swift

+9-9
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ struct BufferView : ~Escapable {
2020
}
2121
self.ptr = ptr
2222
}
23-
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers10BufferViewVyACSW_SaySiGhYlstcfC : $@convention(method) (UnsafeRawBufferPointer, @guaranteed Array<Int>, @thin BufferView.Type) -> _scope(2) @owned BufferView {
23+
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers10BufferViewVyACSW_SaySiGhYlstcfC : $@convention(method) (UnsafeRawBufferPointer, @guaranteed Array<Int>, @thin BufferView.Type) -> _scope(1) @owned BufferView {
2424
init(_ ptr: UnsafeRawBufferPointer, _ a: borrowing Array<Int>) -> dependsOn(a) Self {
2525
self.ptr = ptr
2626
return self
2727
}
28-
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers10BufferViewVyACSW_AA7WrapperVYlitcfC : $@convention(method) (UnsafeRawBufferPointer, @owned Wrapper, @thin BufferView.Type) -> _inherit(2) @owned BufferView {
28+
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers10BufferViewVyACSW_AA7WrapperVYlitcfC : $@convention(method) (UnsafeRawBufferPointer, @owned Wrapper, @thin BufferView.Type) -> _inherit(1) @owned BufferView {
2929
init(_ ptr: UnsafeRawBufferPointer, _ a: consuming Wrapper) -> dependsOn(a) Self {
3030
self.ptr = ptr
3131
return self
3232
}
33-
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers10BufferViewVyACSW_AA7WrapperVYliSaySiGhYlstcfC : $@convention(method) (UnsafeRawBufferPointer, @owned Wrapper, @guaranteed Array<Int>, @thin BufferView.Type) -> _inherit(2) _scope(3) @owned BufferView {
33+
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers10BufferViewVyACSW_AA7WrapperVYliSaySiGhYlstcfC : $@convention(method) (UnsafeRawBufferPointer, @owned Wrapper, @guaranteed Array<Int>, @thin BufferView.Type) -> _inherit(1) _scope(2) @owned BufferView {
3434
init(_ ptr: UnsafeRawBufferPointer, _ a: consuming Wrapper, _ b: borrowing Array<Int>) -> dependsOn(a) dependsOn(b) Self {
3535
self.ptr = ptr
3636
return self
@@ -56,25 +56,25 @@ func testBasic() {
5656
}
5757
}
5858

59-
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers6deriveyAA10BufferViewVADYlsF : $@convention(thin) (@guaranteed BufferView) -> _scope(1) @owned BufferView {
59+
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers6deriveyAA10BufferViewVADYlsF : $@convention(thin) (@guaranteed BufferView) -> _scope(0) @owned BufferView {
6060
func derive(_ x: borrowing BufferView) -> dependsOn(scoped x) BufferView {
6161
return BufferView(x.ptr)
6262
}
6363

64-
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers16consumeAndCreateyAA10BufferViewVADnYliF : $@convention(thin) (@owned BufferView) -> _inherit(1) @owned BufferView {
64+
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers16consumeAndCreateyAA10BufferViewVADnYliF : $@convention(thin) (@owned BufferView) -> _inherit(0) @owned BufferView {
6565
func consumeAndCreate(_ x: consuming BufferView) -> dependsOn(x) BufferView {
6666
return BufferView(x.ptr)
6767
}
6868

69-
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers17deriveThisOrThat1yAA10BufferViewVADYls_ADYlstF : $@convention(thin) (@guaranteed BufferView, @guaranteed BufferView) -> _scope(1, 2) @owned BufferView {
69+
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers17deriveThisOrThat1yAA10BufferViewVADYls_ADYlstF : $@convention(thin) (@guaranteed BufferView, @guaranteed BufferView) -> _scope(0, 1) @owned BufferView {
7070
func deriveThisOrThat1(_ this: borrowing BufferView, _ that: borrowing BufferView) -> dependsOn(scoped this, that) BufferView {
7171
if (Int.random(in: 1..<100) == 0) {
7272
return BufferView(this.ptr)
7373
}
7474
return BufferView(that.ptr)
7575
}
7676

77-
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers17deriveThisOrThat2yAA10BufferViewVADYls_ADnYlitF : $@convention(thin) (@guaranteed BufferView, @owned BufferView) -> _inherit(2) _scope(1) @owned BufferView {
77+
// CHECK: sil hidden @$s39explicit_lifetime_dependence_specifiers17deriveThisOrThat2yAA10BufferViewVADYls_ADnYlitF : $@convention(thin) (@guaranteed BufferView, @owned BufferView) -> _inherit(1) _scope(0) @owned BufferView {
7878
func deriveThisOrThat2(_ this: borrowing BufferView, _ that: consuming BufferView) -> dependsOn(scoped this) dependsOn(that) BufferView {
7979
if (Int.random(in: 1..<100) == 0) {
8080
return BufferView(this.ptr)
@@ -108,12 +108,12 @@ struct Container : ~Escapable {
108108
}
109109
}
110110

111-
// CHECK-LABEL: sil hidden @$s39explicit_lifetime_dependence_specifiers16getConsumingViewyAA06BufferG0VAA9ContainerVnYliF : $@convention(thin) (@owned Container) -> _inherit(1) @owned BufferView {
111+
// CHECK-LABEL: sil hidden @$s39explicit_lifetime_dependence_specifiers16getConsumingViewyAA06BufferG0VAA9ContainerVnYliF : $@convention(thin) (@owned Container) -> _inherit(0) @owned BufferView {
112112
func getConsumingView(_ x: consuming Container) -> dependsOn(x) BufferView {
113113
return BufferView(x.ptr)
114114
}
115115

116-
// CHECK-LABEL: sil hidden @$s39explicit_lifetime_dependence_specifiers16getBorrowingViewyAA06BufferG0VAA9ContainerVYlsF : $@convention(thin) (@guaranteed Container) -> _scope(1) @owned BufferView {
116+
// CHECK-LABEL: sil hidden @$s39explicit_lifetime_dependence_specifiers16getBorrowingViewyAA06BufferG0VAA9ContainerVYlsF : $@convention(thin) (@guaranteed Container) -> _scope(0) @owned BufferView {
117117
func getBorrowingView(_ x: borrowing Container) -> dependsOn(scoped x) BufferView {
118118
return BufferView(x.ptr)
119119
}

0 commit comments

Comments
 (0)