jyknight added a comment.

In D67983#1723376 <https://reviews.llvm.org/D67983#1723376>, @thakis wrote:

> After this, Class can no longer be used as a key type in an Obj-C dictionary 
> literal. Is that intentional?


Such code was already an on by default incompatible-pointer-types warning in 
ObjC mode. That it worked in ObjC++ was accidental.

For example:

foo.m:

  #import <Foundation/Foundation.h>
  
  int main() {
    NSDictionary* d = @{[NSArray class] : @"bar"};
  }

Compiling:

  $ clang -framework Foundation -o foo foo.m
  foo.m:4:23: warning: incompatible pointer types passing 'Class' to parameter 
of type 'id<NSCopying> _Nonnull' [-Wincompatible-pointer-types]
    NSDictionary* d = @{[NSArray class] : @"bar"};
                        ^~~~~~~~~~~~~~~
  1 warning generated.

While the default metaclass does in fact implement the one method NSCopying 
declares, it's not possible within the language to declare that the Class -- 
itself, as an instance -- implements the instance methods from the NSCopying 
protocol.

You can fix the code just by doing `@{(id)clz : val}`, since id is freely 
castable to anything.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67983/new/

https://reviews.llvm.org/D67983



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to