vsapsai added a comment.

In D66831#1902176 <https://reviews.llvm.org/D66831#1902176>, @smeenai wrote:

> Thanks for that explanation; that makes sense. Do you think that the 
> `@interface J : I` would also ideally be an error then?


Theoretically, I think `@interface J : I` should also trigger an error (or at 
least a warning) because in a block we can call J-specific methods that aren't 
declared in any protocols. And that can potentially lead to not recognized 
selector.

Practically, if I remember correctly, that is done on purpose to make 
id-with-protocols more like id that is compatible with anything. Here my memory 
gets really hazy but it is possible there is common and idiomatic code relying 
on less strict type checking. But don't take my word for granted, I might be 
mistaken. If you are interested, the relevant code is in 
ASTContext::ObjCQualifiedIdTypesAreCompatible 
<https://github.com/llvm/llvm-project/blob/13fd50cc26401a64e9e7379d4f9adaa4c54c5f55/clang/lib/AST/ASTContext.cpp#L8136>.
 And for the case like

  void test(id<P> p) {
    J *j = p;
  }

the block with protocol checking 
<https://github.com/llvm/llvm-project/blob/13fd50cc26401a64e9e7379d4f9adaa4c54c5f55/clang/lib/AST/ASTContext.cpp#L8221-L8222>
 can be particularly interesting.


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