Skip to content

Commit 834a7d5

Browse files
authored
Merge pull request #10767 from CodaFi/crushing-let
2 parents 9fb952c + f117795 commit 834a7d5

18 files changed

+54
-76
lines changed

include/swift/AST/Decl.h

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4333,7 +4333,7 @@ class VarDecl : public AbstractStorageDecl {
43334333

43344334
// For Param Decls
43354335

4336-
None = Let,
4336+
Owned = Let,
43374337
InOut = 2,
43384338
};
43394339

@@ -4464,6 +4464,9 @@ class VarDecl : public AbstractStorageDecl {
44644464
Specifier getSpecifier() const {
44654465
return static_cast<Specifier>(VarDeclBits.Specifier);
44664466
}
4467+
void setSpecifier(Specifier Spec) {
4468+
VarDeclBits.Specifier = static_cast<unsigned>(Spec);
4469+
}
44674470

44684471
/// Is this a type ('static') variable?
44694472
bool isStatic() const { return VarDeclBits.IsStatic; }
@@ -4474,18 +4477,6 @@ class VarDecl : public AbstractStorageDecl {
44744477

44754478
/// Is this an immutable 'let' property?
44764479
bool isLet() const { return getSpecifier() == Specifier::Let; }
4477-
// FIXME: Remove this setter.
4478-
void setLet(bool immutable) {
4479-
auto specifier = VarDecl::Specifier::Let;
4480-
if (!immutable) {
4481-
if (getKind() == DeclKind::Param) {
4482-
specifier = VarDecl::Specifier::InOut;
4483-
} else {
4484-
specifier = VarDecl::Specifier::Var;
4485-
}
4486-
}
4487-
VarDeclBits.Specifier = static_cast<unsigned>(specifier);
4488-
}
44894480

44904481
/// Is this an element in a capture list?
44914482
bool isCaptureList() const { return VarDeclBits.IsCaptureList; }

include/swift/Parse/Parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,7 +981,7 @@ class Parser {
981981
SourceLoc SpecifierLoc;
982982

983983
/// The parsed specifier kind, if present.
984-
VarDecl::Specifier SpecifierKind = VarDecl::Specifier::None;
984+
VarDecl::Specifier SpecifierKind = VarDecl::Specifier::Owned;
985985

986986
/// The location of the first name.
987987
///

lib/AST/Builtins.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ getBuiltinFunction(Identifier Id, ArrayRef<Type> argTypes, Type ResType,
158158

159159
SmallVector<ParamDecl*, 4> params;
160160
for (Type argType : argTypes) {
161-
auto PD = new (Context) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
161+
auto PD = new (Context) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
162162
Identifier(), SourceLoc(),
163163
Identifier(), argType,
164164
DC);
@@ -217,7 +217,7 @@ getBuiltinGenericFunction(Identifier Id,
217217
for (unsigned i = 0, e = ArgParamTypes.size(); i < e; i++) {
218218
auto paramType = ArgBodyTypes[i];
219219
auto paramIfaceType = ArgParamTypes[i].getType();
220-
auto PD = new (Context) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
220+
auto PD = new (Context) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
221221
Identifier(), SourceLoc(),
222222
Identifier(), paramType, DC);
223223
PD->setInterfaceType(paramIfaceType);

lib/AST/Decl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4191,7 +4191,7 @@ Type DeclContext::getSelfInterfaceType() const {
41914191
/// generic parameters.
41924192
ParamDecl *ParamDecl::createUnboundSelf(SourceLoc loc, DeclContext *DC) {
41934193
ASTContext &C = DC->getASTContext();
4194-
auto *selfDecl = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
4194+
auto *selfDecl = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
41954195
Identifier(), loc, C.Id_self, Type(), DC);
41964196
selfDecl->setImplicit();
41974197
return selfDecl;
@@ -4211,7 +4211,7 @@ ParamDecl *ParamDecl::createSelf(SourceLoc loc, DeclContext *DC,
42114211
ASTContext &C = DC->getASTContext();
42124212
auto selfType = DC->getSelfTypeInContext();
42134213
auto selfInterfaceType = DC->getSelfInterfaceType();
4214-
auto specifier = VarDecl::Specifier::None;
4214+
auto specifier = VarDecl::Specifier::Owned;
42154215
assert(selfType && selfInterfaceType);
42164216

42174217
if (isStaticMethod) {

lib/ClangImporter/ImportDecl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ makeEnumRawValueConstructor(ClangImporter::Implementation &Impl,
386386
auto selfDecl = ParamDecl::createSelf(SourceLoc(), enumDecl,
387387
/*static*/false, /*inout*/true);
388388

389-
auto param = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(),
389+
auto param = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),
390390
SourceLoc(), C.Id_rawValue,
391391
SourceLoc(), C.Id_rawValue,
392392
enumDecl->getRawType(),
@@ -593,7 +593,7 @@ static FuncDecl *makeFieldSetterDecl(ClangImporter::Implementation &Impl,
593593
auto &C = Impl.SwiftContext;
594594
auto selfDecl = ParamDecl::createSelf(SourceLoc(), importedDecl,
595595
/*isStatic*/false, /*isInOut*/true);
596-
auto newValueDecl = new (C) ParamDecl(VarDecl::Specifier::None,
596+
auto newValueDecl = new (C) ParamDecl(VarDecl::Specifier::Owned,
597597
SourceLoc(), SourceLoc(),
598598
Identifier(), SourceLoc(), C.Id_value,
599599
importedFieldDecl->getType(),
@@ -1128,7 +1128,7 @@ createValueConstructor(ClangImporter::Implementation &Impl,
11281128

11291129
Identifier argName = generateParamName ? var->getName() : Identifier();
11301130
auto param = new (context)
1131-
ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(), argName,
1131+
ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(), argName,
11321132
SourceLoc(), var->getName(), var->getType(), structDecl);
11331133
param->setInterfaceType(var->getInterfaceType());
11341134
valueParameters.push_back(param);

lib/ClangImporter/ImportType.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,7 +1675,7 @@ ParameterList *ClangImporter::Implementation::importFunctionParameterList(
16751675
// imported header unit.
16761676
auto paramInfo = createDeclWithClangNode<ParamDecl>(
16771677
param, Accessibility::Private,
1678-
VarDecl::Specifier::None, SourceLoc(), SourceLoc(), name,
1678+
VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(), name,
16791679
importSourceLoc(param->getLocation()), bodyName,
16801680
dc->mapTypeIntoContext(swiftParamTy),
16811681
ImportedHeaderUnit);
@@ -1696,7 +1696,7 @@ ParameterList *ClangImporter::Implementation::importFunctionParameterList(
16961696
BoundGenericType::get(SwiftContext.getArrayDecl(), Type(),
16971697
{SwiftContext.TheAnyType});
16981698
auto name = SwiftContext.getIdentifier("varargs");
1699-
auto param = new (SwiftContext) ParamDecl(VarDecl::Specifier::None,
1699+
auto param = new (SwiftContext) ParamDecl(VarDecl::Specifier::Owned,
17001700
SourceLoc(), SourceLoc(),
17011701
Identifier(), SourceLoc(),
17021702
name, paramTy,
@@ -1997,7 +1997,7 @@ Type ClangImporter::Implementation::importMethodType(
19971997
// It doesn't actually matter which DeclContext we use, so just
19981998
// use the imported header unit.
19991999
auto type = TupleType::getEmpty(SwiftContext);
2000-
auto var = new (SwiftContext) ParamDecl(VarDecl::Specifier::None, SourceLoc(),
2000+
auto var = new (SwiftContext) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),
20012001
SourceLoc(), argName,
20022002
SourceLoc(), argName, type,
20032003
ImportedHeaderUnit);
@@ -2115,7 +2115,7 @@ Type ClangImporter::Implementation::importMethodType(
21152115
// Set up the parameter info.
21162116
auto paramInfo
21172117
= createDeclWithClangNode<ParamDecl>(param, Accessibility::Private,
2118-
VarDecl::Specifier::None,
2118+
VarDecl::Specifier::Owned,
21192119
SourceLoc(), SourceLoc(), name,
21202120
importSourceLoc(param->getLocation()),
21212121
bodyName,
@@ -2239,7 +2239,7 @@ Type ClangImporter::Implementation::importAccessorMethodType(
22392239
Identifier argLabel = functionName.getDeclName().getArgumentNames().front();
22402240
auto paramInfo
22412241
= createDeclWithClangNode<ParamDecl>(param, Accessibility::Private,
2242-
VarDecl::Specifier::None,
2242+
VarDecl::Specifier::Owned,
22432243
/*let loc*/SourceLoc(),
22442244
/*label loc*/SourceLoc(),
22452245
argLabel, nameLoc, bodyName,

lib/Parse/ParseDecl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3503,7 +3503,7 @@ createSetterAccessorArgument(SourceLoc nameLoc, Identifier name,
35033503
name = P.Context.getIdentifier(implName);
35043504
}
35053505

3506-
auto result = new (P.Context) ParamDecl(VarDecl::Specifier::None,
3506+
auto result = new (P.Context) ParamDecl(VarDecl::Specifier::Owned,
35073507
SourceLoc(),SourceLoc(),
35083508
Identifier(), nameLoc, name,
35093509
Type(), P.CurDeclContext);
@@ -4086,7 +4086,7 @@ VarDecl *Parser::parseDeclVarGetSet(Pattern *pattern,
40864086
diagnose(accessors.LBLoc, diag::let_cannot_be_addressed_property);
40874087
else
40884088
diagnose(accessors.LBLoc, diag::let_cannot_be_computed_property);
4089-
PrimaryVar->setLet(false);
4089+
PrimaryVar->setSpecifier(VarDecl::Specifier::Var);
40904090
Invalid = true;
40914091
}
40924092

lib/Parse/ParseExpr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2373,7 +2373,7 @@ parseClosureSignatureIfPresent(SmallVectorImpl<CaptureListEntry> &captureList,
23732373

23742374
Identifier name = Tok.is(tok::identifier) ?
23752375
Context.getIdentifier(Tok.getText()) : Identifier();
2376-
auto var = new (Context) ParamDecl(VarDecl::Specifier::None, SourceLoc(),
2376+
auto var = new (Context) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),
23772377
SourceLoc(), Identifier(),
23782378
Tok.getLoc(), name, Type(), nullptr);
23792379
elements.push_back(var);
@@ -2672,7 +2672,7 @@ Expr *Parser::parseExprAnonClosureArg() {
26722672
StringRef varName = ("$" + Twine(nextIdx)).toStringRef(StrBuf);
26732673
Identifier ident = Context.getIdentifier(varName);
26742674
SourceLoc varLoc = leftBraceLoc;
2675-
auto *var = new (Context) ParamDecl(VarDecl::Specifier::None, SourceLoc(),SourceLoc(),
2675+
auto *var = new (Context) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),SourceLoc(),
26762676
Identifier(), varLoc, ident, Type(),
26772677
closure);
26782678
var->setImplicit();

lib/Parse/ParsePattern.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ mapParsedParameters(Parser &parser,
381381
} else if (paramInfo.SpecifierKind == VarDecl::Specifier::InOut) {
382382
parser.diagnose(paramInfo.SpecifierLoc, diag::inout_must_have_type);
383383
paramInfo.SpecifierLoc = SourceLoc();
384-
paramInfo.SpecifierKind = VarDecl::Specifier::None;
384+
paramInfo.SpecifierKind = VarDecl::Specifier::Owned;
385385
}
386386
return param;
387387
};

lib/SILGen/SILGenConstructor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ static SILValue emitConstructorMetatypeArg(SILGenFunction &gen,
3434
Type metatype = ctor->getInterfaceType()->castTo<AnyFunctionType>()->getInput();
3535
auto *DC = ctor->getInnermostDeclContext();
3636
auto &AC = gen.getASTContext();
37-
auto VD = new (AC) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
37+
auto VD = new (AC) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
3838
AC.getIdentifier("$metatype"), SourceLoc(),
3939
AC.getIdentifier("$metatype"), Type(),
4040
DC);
@@ -61,7 +61,7 @@ static RValue emitImplicitValueConstructorArg(SILGenFunction &gen,
6161
return tuple;
6262
} else {
6363
auto &AC = gen.getASTContext();
64-
auto VD = new (AC) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
64+
auto VD = new (AC) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
6565
AC.getIdentifier("$implicit_value"),
6666
SourceLoc(),
6767
AC.getIdentifier("$implicit_value"), Type(),

lib/Sema/CodeSynthesis.cpp

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -71,25 +71,6 @@ static ParamDecl *buildArgument(SourceLoc loc, DeclContext *DC,
7171
return param;
7272
}
7373

74-
static ParamDecl *buildLetArgument(SourceLoc loc, DeclContext *DC,
75-
StringRef name,
76-
Type type,
77-
Type interfaceType) {
78-
return buildArgument(loc, DC, name, type, interfaceType,
79-
VarDecl::Specifier::None);
80-
}
81-
82-
static ParamDecl *buildInOutArgument(SourceLoc loc, DeclContext *DC,
83-
StringRef name,
84-
Type type,
85-
Type interfaceType) {
86-
return buildArgument(
87-
loc, DC, name,
88-
InOutType::get(type),
89-
InOutType::get(interfaceType),
90-
VarDecl::Specifier::InOut);
91-
}
92-
9374
static Type getTypeOfStorage(AbstractStorageDecl *storage,
9475
bool wantInterfaceType) {
9576
if (auto var = dyn_cast<VarDecl>(storage)) {
@@ -215,10 +196,11 @@ static FuncDecl *createSetterPrototype(AbstractStorageDecl *storage,
215196
// Add a "(value : T, indices...)" argument list.
216197
auto storageType = getTypeOfStorage(storage, false);
217198
auto storageInterfaceType = getTypeOfStorage(storage, true);
218-
valueDecl = buildLetArgument(storage->getLoc(),
219-
storage->getDeclContext(), "value",
220-
storageType,
221-
storageInterfaceType);
199+
valueDecl = buildArgument(storage->getLoc(),
200+
storage->getDeclContext(), "value",
201+
storageType,
202+
storageInterfaceType,
203+
VarDecl::Specifier::Owned);
222204
params.push_back(buildIndexForwardingParamList(storage, valueDecl));
223205

224206
Type setterRetTy = TupleType::getEmpty(TC.Context);
@@ -317,12 +299,14 @@ static FuncDecl *createMaterializeForSetPrototype(AbstractStorageDecl *storage,
317299
// inout storage: Builtin.UnsafeValueBuffer,
318300
// indices...).
319301
ParamDecl *bufferElements[] = {
320-
buildLetArgument(loc, DC, "buffer",
321-
ctx.TheRawPointerType,
322-
ctx.TheRawPointerType),
323-
buildInOutArgument(loc, DC, "callbackStorage",
324-
ctx.TheUnsafeValueBufferType,
325-
ctx.TheUnsafeValueBufferType)
302+
buildArgument(loc, DC, "buffer",
303+
ctx.TheRawPointerType,
304+
ctx.TheRawPointerType,
305+
VarDecl::Specifier::Owned),
306+
buildArgument(loc, DC, "callbackStorage",
307+
InOutType::get(ctx.TheUnsafeValueBufferType),
308+
InOutType::get(ctx.TheUnsafeValueBufferType),
309+
VarDecl::Specifier::InOut)
326310
};
327311
params.push_back(buildIndexForwardingParamList(storage, bufferElements));
328312

@@ -1391,7 +1375,7 @@ void TypeChecker::completePropertyBehaviorParameter(VarDecl *VD,
13911375
llvm::raw_svector_ostream names(ParamNameBuf);
13921376
names << "%arg." << i;
13931377
}
1394-
auto param = new (Context) ParamDecl(VarDecl::Specifier::None,
1378+
auto param = new (Context) ParamDecl(VarDecl::Specifier::Owned,
13951379
SourceLoc(), SourceLoc(),
13961380
Identifier(),
13971381
SourceLoc(),
@@ -1946,7 +1930,7 @@ ConstructorDecl *swift::createImplicitConstructor(TypeChecker &tc,
19461930
}
19471931

19481932
// Create the parameter.
1949-
auto *arg = new (context) ParamDecl(VarDecl::Specifier::None, SourceLoc(),
1933+
auto *arg = new (context) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),
19501934
Loc, var->getName(),
19511935
Loc, var->getName(), varType, decl);
19521936
arg->setInterfaceType(varInterfaceType);

lib/Sema/DerivedConformanceCodable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ static CallExpr *createContainerKeyedByCall(ASTContext &C, DeclContext *DC,
495495
Expr *base, Type returnType,
496496
NominalTypeDecl *param) {
497497
// (keyedBy:)
498-
auto *keyedByDecl = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(),
498+
auto *keyedByDecl = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),
499499
SourceLoc(), C.Id_keyedBy, SourceLoc(),
500500
C.Id_keyedBy, returnType, DC);
501501
keyedByDecl->setImplicit();
@@ -737,7 +737,7 @@ static FuncDecl *deriveEncodable_encode(TypeChecker &tc, Decl *parentDecl,
737737

738738
// Params: (self [implicit], Encoder)
739739
auto *selfDecl = ParamDecl::createSelf(SourceLoc(), target);
740-
auto *encoderParam = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(),
740+
auto *encoderParam = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),
741741
SourceLoc(), C.Id_to, SourceLoc(),
742742
C.Id_encoder, encoderType, target);
743743
encoderParam->setInterfaceType(encoderType);
@@ -1038,7 +1038,7 @@ static ValueDecl *deriveDecodable_init(TypeChecker &tc, Decl *parentDecl,
10381038
auto *selfDecl = ParamDecl::createSelf(SourceLoc(), target,
10391039
/*isStatic=*/false,
10401040
/*isInOut=*/inOut);
1041-
auto *decoderParamDecl = new (C) ParamDecl(VarDecl::Specifier::None,
1041+
auto *decoderParamDecl = new (C) ParamDecl(VarDecl::Specifier::Owned,
10421042
SourceLoc(),
10431043
SourceLoc(), C.Id_from,
10441044
SourceLoc(), C.Id_decoder,

lib/Sema/DerivedConformanceCodingKey.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static void deriveRawValueInit(AbstractFunctionDecl *initDecl) {
7474
DeclNameLoc(), /*Implicit=*/true);
7575

7676
// rawValue param to init(rawValue:)
77-
auto *rawValueDecl = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(),
77+
auto *rawValueDecl = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(),
7878
SourceLoc(), C.Id_rawValue,
7979
SourceLoc(), C.Id_rawValue,
8080
valueParam->getType(), parentDC);
@@ -124,7 +124,7 @@ static ValueDecl *deriveInitDecl(TypeChecker &tc, Decl *parentDecl,
124124
auto *parentDC = cast<DeclContext>(parentDecl);
125125

126126
// rawValue
127-
auto *rawDecl = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
127+
auto *rawDecl = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
128128
paramName, SourceLoc(), paramName,
129129
paramType, parentDC);
130130
rawDecl->setInterfaceType(paramType);

lib/Sema/DerivedConformanceEquatableHashable.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ deriveEquatable_enum_eq(TypeChecker &tc, Decl *parentDecl, EnumDecl *enumDecl) {
217217
auto enumIfaceTy = parentDC->getDeclaredInterfaceType();
218218

219219
auto getParamDecl = [&](StringRef s) -> ParamDecl* {
220-
auto *param = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
220+
auto *param = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
221221
Identifier(), SourceLoc(), C.getIdentifier(s),
222222
enumTy, parentDC);
223223
param->setInterfaceType(enumIfaceTy);

lib/Sema/DerivedConformanceRawRepresentable.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ static ConstructorDecl *deriveRawRepresentable_init(TypeChecker &tc,
267267
auto *selfDecl = ParamDecl::createSelf(SourceLoc(), parentDC,
268268
/*static*/false, /*inout*/true);
269269

270-
auto *rawDecl = new (C) ParamDecl(VarDecl::Specifier::None, SourceLoc(), SourceLoc(),
270+
auto *rawDecl = new (C) ParamDecl(VarDecl::Specifier::Owned, SourceLoc(), SourceLoc(),
271271
C.Id_rawValue, SourceLoc(),
272272
C.Id_rawValue, rawType, parentDC);
273273
rawDecl->setInterfaceType(rawInterfaceType);

lib/Sema/TypeCheckDecl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,10 @@ static void configureImplicitSelf(TypeChecker &tc,
12721272

12731273
// 'self' is 'let' for reference types (i.e., classes) or when 'self' is
12741274
// neither inout.
1275-
selfDecl->setLet(!selfIfaceTy->is<InOutType>());
1275+
auto specifier = selfIfaceTy->is<InOutType>()
1276+
? VarDecl::Specifier::InOut
1277+
: VarDecl::Specifier::Owned;
1278+
selfDecl->setSpecifier(specifier);
12761279

12771280
selfDecl->setInterfaceType(selfIfaceTy);
12781281
}

0 commit comments

Comments
 (0)