diff --git a/lib/Sema/TypeCheckDecl.cpp b/lib/Sema/TypeCheckDecl.cpp index f5b85e8b42ad5..126ef88f8b38c 100644 --- a/lib/Sema/TypeCheckDecl.cpp +++ b/lib/Sema/TypeCheckDecl.cpp @@ -6101,7 +6101,7 @@ class DeclChecker : public DeclVisitor { // it is in the same module, update the vtable. if (auto *baseDecl = dyn_cast(base->getDeclContext())) { if (baseDecl->hasKnownSwiftImplementation() && - !base->isDynamic() && + !base->isDynamic() && !isKnownObjC && override->getDeclContext()->isExtensionContext()) { // For compatibility, only generate a warning in Swift 3 TC.diagnose(override, (TC.Context.isSwiftVersion3() diff --git a/test/decl/inherit/override.swift b/test/decl/inherit/override.swift index 8248fcf11d218..d8a81ee8b1d47 100644 --- a/test/decl/inherit/override.swift +++ b/test/decl/inherit/override.swift @@ -9,6 +9,9 @@ class A { @objc func f3() { } // expected-note{{overridden declaration is here}} @objc func f4() -> ObjCClassA { } // expected-note{{overridden declaration is here}} + @objc var v1: Int { return 0 } // expected-note{{overridden declaration is here}} + @objc var v2: Int { return 0 } // expected-note{{overridden declaration is here}} + @objc var v3: Int = 0 // expected-note{{overridden declaration is here}} dynamic func f3D() { } dynamic func f4D() -> ObjCClassA { } @@ -30,6 +33,15 @@ extension B { override func f3() { } // expected-error{{cannot override a non-dynamic class declaration from an extension}} override func f4() -> ObjCClassB { } // expected-error{{cannot override a non-dynamic class declaration from an extension}} + override var v1: Int { return 1 } // expected-error{{cannot override a non-dynamic class declaration from an extension}} + override var v2: Int { // expected-error{{cannot override a non-dynamic class declaration from an extension}} + get { return 1 } + set { } + } + override var v3: Int { // expected-error{{cannot override a non-dynamic class declaration from an extension}} + willSet { } + didSet { } + } override func f3D() { } override func f4D() -> ObjCClassB { }