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

Reply via email to