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

    <tr>
        <th>Summary</th>
        <td>
            -Wnonnull doesn't prevent returning nil in the basic scenarios for objc code
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Seems like there is no way to enforce nullability checks in objective c correctly.

I was using
`clang main.m -o main -Weverything -framework Foundation`
to compile the snippet below.

```
#import <Foundation/Foundation.h>

const static char* test = "test string";
NS_ASSUME_NONNULL_BEGIN
@interface A : NSObject
- (NSString *)getString;
- (NSString *) getConstString;
@property (nonatomic, strong) NSString *nilString;

@end

@implementation A

@dynamic nilString;

- (nonnull NSString *)getString {
    return nil;
}

- (NSString *)getConstString {
    return @(test);
}

- (NSString *)nilString {
    return nil;
}

@end

static NSString* getStringCStyle(void) {
 return nil;
}

NS_ASSUME_NONNULL_END

int main(void) {
 @autoreleasepool {
        A* a = [A new];
        NSLog(@"nil string: %@, static string: %@, c-style: %@", [a getString], [a getConstString], getStringCStyle());
    }
    return 0;
}

```

The compilation output is:

```
main.m:21:12: warning: implicit conversion from nullable pointer 'NSString * _Nullable' to non-nullable pointer type 'NSString * _Nonnull' [-Wnullable-to-nonnull-conversion]
 return @(test);
           ^
main.m:31:5: warning: null returned from function that requires a non-null return value [-Wnonnull]
    return nil;
```

So apparently I can't return `nil` from the c-style function but I'm free to do so in the ObjectiveC properties and methods.
There is a check that prevents me to return nil indirectly but at the same time I could return nil directly.

```
clang --version
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: arm64-apple-darwin23.3.0
Thread model: posix
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVkuP4jgQ_jXmUkrkOIQOBw7pB6uWZpkDO5pjy3EK8I5jZ20Hln-_chweDcysBrVoYrs-11dfPcKdk1uNuCDFMyleJ7z3O2MXjT1uuUbvJrVpjos1YutAyR8IfocWQTrQBg78CN4A6o2xAkH3SvFaKumPIHYofjiQGkz9Nwov9wgChLEWhVfHlNBXQqv4_Q4H7qB3Um_H5RkViusttFzqtIXEDL8g-Y57tEe_k3oLycbyFg_G_oCl6XXDvTSazGiE8AaEaTupBo_Badl16KFGZQ6fLg8W8S8-sly2nbEeSP5yhcuWl4d0R_K3awxhtPPgPPdSgNhxS1gFHl0AeQXC2PDbeRsYMkby52i3Wn9U6_W3P98-Vl9Xq29fvnw8v_3xvhqhp1Rqj3bDBUIFJK9gtf46BDMeSICwcrVeD7BAWEXYfIs-Pp_veHQKtuhfgs83Z8mUdtZ0aP0xWGmjuTetFIS9BO9N8H4O12BaqluMExLq5mZFtp3CFrUfogjVzXZz1LyVAn6GmYw-hTSDn_EG8jQaAQBY9L3VAfGC9fR6B3oPdhWdh4hkSgkrg6yEzX8H-0zudx29j-iYb6cLQs6dw_Cy9keFhJV7I5sg2uW2_7_qPi3fVp8OSO2HgnyIT6aU995YVMgddsaoz1TDpwrO8lgdxXMFGg-keL3Se75afzFbwsoh0ExLdSqfvALCimH55VRyj7ZE4oYQXC2ysE6KZ36JU7j1avG6KOLOfUSD4FeaBzrn-F1JSX8q5E3DGb7_2uHYr2JtmN53vQfpSF79wjj2R5JXLCN5lbHA9sCtHqMRCk4K6UEYvUfrAvLGmnbs1AqhM0OPAcKerhMVPlbjCcKeQovXRid3Rv7Y4QPLWKHBkBTPyfeTWeJNMlZvcvEnhPlTXj6uLLh8SPF2Qz4P5Isb7kOXiJjYRNabXoshun7HPVj8p5cWHfAzu5MPe656HL0f2RT3Cn-qoEeirg3wruMWtVdHeAfBNWFP_sx0RgPEjEbvwpgak_biad17eCfsqYWNRQxKNAacCXM1nP96mq0vMDZuGQjpBlr0O9O49JxecWjzOJhjBDqLe9TeQTsgX2iB1I2Mg3rwgPs4RHk4KFsMXEyvmmuTk8Gvhmsc6kly0n5YrLpOIcStU5JmRUpTGtrnsJ5kBaUpTac0zUJWRE7cbtEHqbltZ9OEB5yk4fYgNcvTPKUn7hZ5A61pUIXTnXHy34fuTZpF3szzOZ_gInui8zwr8zKb7BbzWc6ymUAh6k0pGiwLnhcZL-fFvKbTYjaRC0bZlOY0y8p8Ps1SKuppXYqcz2closDQvVsuVarUvk2N3U6kcz0uynxGZxPFa1RueAVjTOMBhs3QsIrXiV0Em6Tut45MqZLOuwuKl17h4pym0Bh0MclGcUeJQnVGYQcla-5C2xSouZXGwcbY8J4WXtAanPRWLXbed0PzYUvCllvpd32dCtMStgyXj_-SzprhhYQtB5cdYcuB0n8BAAD__4T5IbE">