@@ -3019,21 +3019,29 @@ ModuleFile::getDeclCheckedImpl(DeclID DID) {
3019
3019
3020
3020
configureStorage (var, opaqueReadOwnership,
3021
3021
readImpl, writeImpl, readWriteImpl, accessors);
3022
-
3023
- if (auto accessLevel = getActualAccessLevel (rawAccessLevel)) {
3024
- var->setAccess (*accessLevel);
3025
- } else {
3022
+ auto accessLevel = getActualAccessLevel (rawAccessLevel);
3023
+ if (!accessLevel) {
3026
3024
error ();
3027
3025
return nullptr ;
3028
3026
}
3029
3027
3028
+ var->setAccess (*accessLevel);
3029
+
3030
3030
if (var->isSettable (nullptr )) {
3031
- if (auto setterAccess = getActualAccessLevel (rawSetterAccessLevel)) {
3032
- var->setSetterAccess (*setterAccess);
3033
- } else {
3031
+ auto setterAccess = getActualAccessLevel (rawSetterAccessLevel);
3032
+ if (!setterAccess) {
3034
3033
error ();
3035
3034
return nullptr ;
3036
3035
}
3036
+ var->setSetterAccess (*setterAccess);
3037
+
3038
+ // If we have a less-accessible setter, honor that by adding the
3039
+ // setter access attribute.
3040
+ if (*setterAccess < *accessLevel) {
3041
+ AddAttribute (
3042
+ new (ctx) SetterAccessAttr (SourceLoc (), SourceLoc (),
3043
+ *setterAccess, /* implicit*/ true ));
3044
+ }
3037
3045
}
3038
3046
3039
3047
if (isImplicit)
@@ -3044,6 +3052,10 @@ ModuleFile::getDeclCheckedImpl(DeclID DID) {
3044
3052
if (var->getOverriddenDecl ())
3045
3053
AddAttribute (new (ctx) OverrideAttr (SourceLoc ()));
3046
3054
3055
+ // Add the @_hasStorage attribute if this var has storage.
3056
+ if (var->hasStorage ())
3057
+ AddAttribute (new (ctx) HasStorageAttr (/* isImplicit:*/ true ));
3058
+
3047
3059
break ;
3048
3060
}
3049
3061
0 commit comments