@@ -172,6 +172,10 @@ static FuncDecl *createGetterPrototype(AbstractStorageDecl *storage,
172
172
if (storage->isStatic ())
173
173
getter->setStatic ();
174
174
175
+ if (auto *overridden = storage->getOverriddenDecl ())
176
+ if (auto *overriddenAccessor = overridden->getGetter ())
177
+ getter->setOverriddenDecl (overriddenAccessor);
178
+
175
179
return getter;
176
180
}
177
181
@@ -219,6 +223,14 @@ static FuncDecl *createSetterPrototype(AbstractStorageDecl *storage,
219
223
if (isStatic)
220
224
setter->setStatic ();
221
225
226
+ if (auto *overridden = storage->getOverriddenDecl ()) {
227
+ auto *overriddenAccessor = overridden->getSetter ();
228
+ if (overriddenAccessor &&
229
+ overridden->isSetterAccessibleFrom (storage->getDeclContext ())) {
230
+ setter->setOverriddenDecl (overriddenAccessor);
231
+ }
232
+ }
233
+
222
234
return setter;
223
235
}
224
236
@@ -351,7 +363,15 @@ static FuncDecl *createMaterializeForSetPrototype(AbstractStorageDecl *storage,
351
363
// materializeForSet is final if the storage is.
352
364
if (storage->isFinal ())
353
365
makeFinal (ctx, materializeForSet);
354
-
366
+
367
+ if (auto *overridden = storage->getOverriddenDecl ()) {
368
+ auto *overriddenAccessor = overridden->getMaterializeForSetFunc ();
369
+ if (overriddenAccessor && !overriddenAccessor->hasForcedStaticDispatch () &&
370
+ overridden->isSetterAccessibleFrom (storage->getDeclContext ())) {
371
+ materializeForSet->setOverriddenDecl (overriddenAccessor);
372
+ }
373
+ }
374
+
355
375
// If the storage is dynamic or ObjC-native, we can't add a dynamically-
356
376
// dispatched method entry for materializeForSet, so force it to be
357
377
// statically dispatched. ("final" would be inappropriate because the
@@ -709,11 +729,6 @@ static void synthesizeTrivialGetter(FuncDecl *getter,
709
729
SourceLoc loc = storage->getLoc ();
710
730
getter->setBody (BraceStmt::create (ctx, loc, returnStmt, loc, true ));
711
731
712
- // Record the getter as an override, which can happen with addressors.
713
- if (auto *baseASD = storage->getOverriddenDecl ())
714
- if (baseASD->isAccessibleFrom (storage->getDeclContext ()))
715
- getter->setOverriddenDecl (baseASD->getGetter ());
716
-
717
732
// Register the accessor as an external decl if the storage was imported.
718
733
if (needsToBeRegisteredAsExternalDecl (storage))
719
734
TC.Context .addExternalDecl (getter);
@@ -734,15 +749,6 @@ static void synthesizeTrivialSetter(FuncDecl *setter,
734
749
setterBody, TC);
735
750
setter->setBody (BraceStmt::create (ctx, loc, setterBody, loc, true ));
736
751
737
- // Record the setter as an override, which can happen with addressors.
738
- if (auto *baseASD = storage->getOverriddenDecl ()) {
739
- auto *baseSetter = baseASD->getSetter ();
740
- if (baseSetter != nullptr &&
741
- baseASD->isSetterAccessibleFrom (storage->getDeclContext ())) {
742
- setter->setOverriddenDecl (baseSetter);
743
- }
744
- }
745
-
746
752
// Register the accessor as an external decl if the storage was imported.
747
753
if (needsToBeRegisteredAsExternalDecl (storage))
748
754
TC.Context .addExternalDecl (setter);
@@ -848,21 +854,6 @@ static FuncDecl *addMaterializeForSet(AbstractStorageDecl *storage,
848
854
storage->getSetter ());
849
855
storage->setMaterializeForSetFunc (materializeForSet);
850
856
851
- // Make sure we record the override.
852
- //
853
- // FIXME: Instead, we should just not call checkOverrides() on
854
- // storage until all accessors are in place.
855
- if (auto *baseASD = storage->getOverriddenDecl ()) {
856
- // If the base storage has a private setter, we're not overriding
857
- // materializeForSet either.
858
- auto *baseMFS = baseASD->getMaterializeForSetFunc ();
859
- if (baseMFS != nullptr &&
860
- !baseMFS->hasForcedStaticDispatch () &&
861
- baseASD->isSetterAccessibleFrom (storage->getDeclContext ())) {
862
- materializeForSet->setOverriddenDecl (baseMFS);
863
- }
864
- }
865
-
866
857
return materializeForSet;
867
858
}
868
859
0 commit comments