@@ -435,7 +435,8 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
435
435
void visitFinalAttr (FinalAttr *attr);
436
436
void visitMoveOnlyAttr (MoveOnlyAttr *attr);
437
437
void visitCompileTimeLiteralAttr (CompileTimeLiteralAttr *attr) {}
438
- void visitConstValAttr (ConstValAttr *attr) {}
438
+ void visitConstValAttr (ConstValAttr *attr);
439
+ void visitConstInitializedAttr (ConstInitializedAttr *attr);
439
440
void visitIBActionAttr (IBActionAttr *attr);
440
441
void visitIBSegueActionAttr (IBSegueActionAttr *attr);
441
442
void visitLazyAttr (LazyAttr *attr);
@@ -2843,6 +2844,41 @@ void AttributeChecker::visitMoveOnlyAttr(MoveOnlyAttr *attr) {
2843
2844
.fixItRemove (attr->getRange ());
2844
2845
}
2845
2846
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
+
2846
2882
// / Return true if this is a builtin operator that cannot be defined in user
2847
2883
// / code.
2848
2884
static bool isBuiltinOperator (StringRef name, DeclAttribute *attr) {
0 commit comments