<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55703>55703</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Apple clang produces duplicate nullable-to-nonnull-conversion warnings in Obj-C
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          benanderman
      </td>
    </tr>
</table>

<pre>
    Clang seems to generate two identical nullable-to-nonnull-conversion warnings in specific cases in Obj-C. It seems to only happen when assigning to an Obj-C property, and only if the type (besides nullability) doesn't change as well.

This code illustrates the one case it does happen in, and two similar cases where it doesn't happen:
```
#import <Foundation/Foundation.h>

@interface WarningClass : NSObject
@property(nonatomic, strong, readwrite) NSString * _Nonnull nonnullString;
@end

@implementation WarningClass
@end

int main() {
  NSString * _Nullable nullableString = @"null";

  WarningClass *instance = [WarningClass new];
  // Incorrectly generates two warnings (one with caret, then one without):
  instance.nonnullString = nullableString;

  NSString * _Nonnull nonnullString = @"non-null";
  // Correctly generates only one warning (with caret):
  nonnullString = nullableString;

  NSMutableString * _Nullable nullableMutableString = [@"null" mutableCopy];
  // Correctly generates only one warning (with caret):
  nonnullString = nullableMutableString;

  return 0;
}
```

I'm seeing this when compiling with: `clang -o warnings duplicate-warning-testcase.m -Wnullable-to-nonnull-conversion -framework Foundation` with `clang --version`:
```
Apple clang version 13.0.0 (clang-1300.0.29.30)
Target: x86_64-apple-darwin21.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

This is the output I see:
```
duplicate-warning-testcase.m:15:28: warning: implicit conversion from nullable pointer 'NSString * _Nullable' to non-nullable pointer type 'NSString * _Nonnull' [-Wnullable-to-nonnull-conversion]
  instance.nonnullString = nullableString;
                           ^
duplicate-warning-testcase.m:15:28: warning: implicit conversion from nullable pointer 'NSString * _Nullable' to non-nullable pointer type 'NSString * _Nonnull' [-Wnullable-to-nonnull-conversion]
duplicate-warning-testcase.m:19:19: warning: implicit conversion from nullable pointer 'NSString * _Nullable' to non-nullable pointer type 'NSString * _Nonnull' [-Wnullable-to-nonnull-conversion]
  nonnullString = nullableString;
                  ^
duplicate-warning-testcase.m:22:19: warning: implicit conversion from nullable pointer 'NSMutableString * _Nullable' to non-nullable pointer type 'NSString * _Nonnull' [-Wnullable-to-nonnull-conversion]
  nonnullString = nullableMutableString;
                  ^
4 warnings generated.
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzlV0uP4zYM_jXORbDhyHEehxxmkw0wh04Ps8D2tlBsJlErS4YkTyb_vqRs57XJTHeKAl1sEDiWKFLkR-qjsjblYb5QQm-ZA6gc84ZtQYMVHpjfGyZL0F4WQjHdKCXWCmJvYm00DePC6BewThrN9sJqqbeOSc1cDYXcyIIVwkGY-X39Z7xI2KM_bWO0OrCdqGtA5R0-hHNySzZIKjodVltTg_WHiC9wsmzV5Ib5HTp4qIFFfLoGh366zkWpJC2fsdKA0xGfeFbsMELAHdgelEqidBmlD-3zy046VpgSmFSqcZ4id8G60RACYNIHU72zUve-EEBOVlIJ24WKgdijQrt3qxVl3X7ROO2-7ZBnsqqN9SzKFivT6FJ4hDPiq9Mg2UXZ53Ofo1EqtQe7EQWwry3wmETn0MgDe3pG5KDwx7UnCKeYOOFNJQsKAYM1ektvFkS5t9IDwfb0_OwtpSHiD-zbU5tq1qW8FUXZp6N10OW1b1WtoMK6Cd5fOHhPC8NhlSBkp-RCNOnss2tvuiI8VmMvzJYMrUackwB_Th52di5h4rij80IjfkE1_3Qh17CP8uXRBkOFFX7Zoy6MtYgt1mB_TFwog2P5YwRUOHvpd1gTFjzh66m--2nT4NzsWBCM9a4kFxgHxy7D_C6of5Cqc2iMjq_hOYa2uBFYOGvB7TY6Cu48sPMgPuD7b40_T-HN_F6taXN1kWlWtUsWpj7cTNp_F9mFc98FiIYaq1l6EkyWtzkgPB-RLSqix8CAxEqBFQtT1choOEf-0flGvSIwdnxWdmVTK6RpD3E3FWOYnkgpqVj89R3yjjdWVLA39i92xkHjtC3j04Zxp0Cu3yG0hxoPP2vX9-aHWZImKWEc5uNhluI44bMkSwnrloiF3SL0GODrdPxtPIoFWYpLYfdS82GSJ2nP2ERXrELOVrS8Nk6-dhjSSVIKyqW0ASq-In8IGPTD4fAPovoETeP7wiCJak_TS3gBRSyJ71-MUdgw5Gn9EjaiUT55LXwvQ1HjaPUa3-8nNXQX2fWTxteNZ4-U43vovZVG1Bnm-ECKxNA6Ob0S38oCm85ZRjfWVMc6RYhCv0A8Jrf5FAXUdXuGuFDquuy1ZltFpIgn8r0Ko4P5YbZj9z9R_vkXAe69AGf942cN8AdayMfrgDrfv4bpjb71v0Drdlt6A7TRqY_0LbJMrvhpUM6zcpbNxMBLr2B-zvN4wSybAs660I_8Wwj3_EFj1Xznfe2IGkPj3mLvadYJNkAcKPXS_8S4Xbjf8pV0rgGi6TyfpNlgNy94DpNUTLL1uJzOikkBm9lwWK7zEjif4RJ0CpSb0yUiXw7knKecpznP-XDERzwBVOUwmWZiNsw5n9BNFe-lKqGNE2O3AzsPPqybrUOhks67k7D9CwPQ2xcNXvfsfA0a_y6ArYQeBJfnwd-_AQKTYIg">