@@ -435,7 +435,8 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
435435 void visitFinalAttr (FinalAttr *attr);
436436 void visitMoveOnlyAttr (MoveOnlyAttr *attr);
437437 void visitCompileTimeLiteralAttr (CompileTimeLiteralAttr *attr) {}
438- void visitConstValAttr (ConstValAttr *attr) {}
438+ void visitConstValAttr (ConstValAttr *attr);
439+ void visitConstInitializedAttr (ConstInitializedAttr *attr);
439440 void visitIBActionAttr (IBActionAttr *attr);
440441 void visitIBSegueActionAttr (IBSegueActionAttr *attr);
441442 void visitLazyAttr (LazyAttr *attr);
@@ -2843,6 +2844,41 @@ void AttributeChecker::visitMoveOnlyAttr(MoveOnlyAttr *attr) {
28432844 .fixItRemove (attr->getRange ());
28442845}
28452846
2847+ void AttributeChecker::visitConstValAttr (ConstValAttr *attr) {
2848+ auto *VD = dyn_cast<VarDecl>(D);
2849+ if (VD) {
2850+ // FIXME: Do not allow 'var' on @const protocol requirements, only allow
2851+ // 'let' (once that's implemented to be allowed at all).
2852+ if (!VD->isLet () && !isa<ProtocolDecl>(D->getDeclContext ())) {
2853+ diagnose (D->getStartLoc (), diag::attr_only_one_decl_kind,
2854+ attr, " let" );
2855+ attr->setInvalid ();
2856+ return ;
2857+ }
2858+ }
2859+ }
2860+
2861+ void AttributeChecker::visitConstInitializedAttr (ConstInitializedAttr *attr) {
2862+ auto *VD = cast<VarDecl>(D);
2863+
2864+ if (D->getDeclContext ()->isLocalContext ()) {
2865+ diagnose (attr->getLocation (), diag::attr_only_at_non_local_scope,
2866+ attr->getAttrName ());
2867+ } else
2868+ if (isa<ProtocolDecl>(D->getDeclContext ())) {
2869+ diagnose (attr->getLocation (), diag::attr_unusable_in_protocol,
2870+ attr);
2871+ } else
2872+ if (!VD->isStatic () && !D->getDeclContext ()->isModuleScopeContext ()) {
2873+ diagnose (attr->getLocation (), diag::attr_only_on_static_properties,
2874+ attr->getAttrName ());
2875+ } else
2876+ if (!VD->hasStorageOrWrapsStorage ()) {
2877+ diagnose (attr->getLocation (), diag::attr_not_on_computed_properties,
2878+ attr);
2879+ }
2880+ }
2881+
28462882// / Return true if this is a builtin operator that cannot be defined in user
28472883// / code.
28482884static bool isBuiltinOperator (StringRef name, DeclAttribute *attr) {
0 commit comments