@@ -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,39 @@ 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+ if (!VD->isLet () && !isa<ProtocolDecl>(D->getDeclContext ())) {
2851+ diagnose (D->getStartLoc (), diag::attr_only_one_decl_kind,
2852+ attr, " let" );
2853+ attr->setInvalid ();
2854+ return ;
2855+ }
2856+ }
2857+ }
2858+
2859+ void AttributeChecker::visitConstInitializedAttr (ConstInitializedAttr *attr) {
2860+ auto *VD = cast<VarDecl>(D);
2861+
2862+ if (D->getDeclContext ()->isLocalContext ()) {
2863+ diagnose (attr->getLocation (), diag::attr_only_at_non_local_scope,
2864+ attr->getAttrName ());
2865+ } else
2866+ if (isa<ProtocolDecl>(D->getDeclContext ())) {
2867+ diagnose (attr->getLocation (), diag::attr_unusable_in_protocol,
2868+ attr);
2869+ } else
2870+ if (!VD->isStatic () && !D->getDeclContext ()->isModuleScopeContext ()) {
2871+ diagnose (attr->getLocation (), diag::attr_only_on_static_properties,
2872+ attr->getAttrName ());
2873+ } else
2874+ if (!VD->hasStorageOrWrapsStorage ()) {
2875+ diagnose (attr->getLocation (), diag::attr_not_on_computed_properties,
2876+ attr);
2877+ }
2878+ }
2879+
28462880// / Return true if this is a builtin operator that cannot be defined in user
28472881// / code.
28482882static bool isBuiltinOperator (StringRef name, DeclAttribute *attr) {
0 commit comments