vsapsai added a comment. In D66831#1901972 <https://reviews.llvm.org/D66831#1901972>, @smeenai wrote:
> I'm not very familiar with Objective-C semantics. Does saying `@interface J : > I <Q>` mean we're overriding the conformance being specified by `@interface I > <P>`? In that case, the Clang 10 error makes sense to me. `@interface J : I <Q>` isn't overriding the conformance specified by `@interface I <P>`, it adds conformance to Q. In D66831#1901972 <https://reviews.llvm.org/D66831#1901972>, @smeenai wrote: > In practice though, classes like `UIImage` are declared as inheriting from > `NSObject<NSSecureCoding>`, so passing a `UIImage *` to a block with a > parameter of type `id<NSObject>` gives an error with Clang 10. I didn't try your example in a debugger but I believe we should warn here because code invoking the block is not guaranteed to call it with `UIImage *`, only with `id<NSObject>`. And using `UIImage *` inside the block is dangerous. To expand on your example @protocol P @end @protocol Q - (void)specificMethod; @end @interface I <P> @end @interface J : I <Q> - (void)specificMethod; @end void f(void (^block)(id<P>)) { I *i = [I new]; block(i); } void g() { f(^(J *j){ [j specificMethod]; // not recognized selector }); } According to this explanation `@interface J : I` should also cause errors but I think it works because assigning to/from `id<Protocol>` is somewhat hand-wavy and not very strict. Also consider specifying protocols the other way around @protocol P @end @protocol Q @end @interface I <P> @end @interface J : I <Q> @end void f(void (^)(J *)); void g() { f(^(id<P> p){}); f(^(id<Q> q){}); } I think it shouldn't be an error but clang-9 complains. Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D66831/new/ https://reviews.llvm.org/D66831 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits