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

    <tr>
        <th>Summary</th>
        <td>
            [GNU ObjC] Clang 14 regression: class methods always return nil object with ARC and optimization
        </td>
    </tr>

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

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

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

<pre>
    Using using Automatic Reference Counting and `-O1` or better optimization using Clang 14.0.5 or 15.0 rc1 causes class methods returning an ObjC object type to always return a null pointer.

This works correctly with Clang 13, or when not using ARC, or when using `-O0` optimization. Methods returning C primitive types are not affected.

The following code reproduces the issue:

```objc
#include <stdio.h>
#import "objc/runtime.h"

__attribute__((objc_root_class))
@interface TestObj { id isa; }
+ (Class)class;
+ (id)testObj;
+ (const char *)testStr;
+ (int)testNum;
@end

@implementation TestObj
+ (Class)class {
        return self;
}
+ (id)testObj {
        id testObj = @"Test";
        printf("returning testObj: 0x%p\n", testObj);
        return testObj;
}
+ (const char *)testStr {
        return "forty two";
}
+ (int)testNum {
        return 42;
}
@end

int main() {
        id testClass = [TestObj class];
        printf("testClass: %s (%p)\n", class_getName(testClass), testClass);
        TestObj *testObj = [TestObj testObj];
        printf("testObj: 0x%p\n", testObj);
        const char *testStr = [TestObj testStr];
        printf("testStr: %s\n", testStr);
        int testNum = [TestObj testNum];
        printf("testNum: %d\n", testNum);

        return 0;
}
```

Build command:
```
"C:\Program Files\LLVM-14\bin\clang" -IC:\libobjc2\include -LC:\libobjc2\lib -fobjc-runtime=gnustep-2.0 -fobjc-arc -fuse-ld=lld -lobjc -O2 -o test.exe test.m
```

Output:
```
testClass: TestObj (00007FF7CD7F1158)
returning testObj: 0xA9979F4000000024
testObj: 0x0000000000000000   // <<<< should be 0xA9979F4000000024
testStr: forty two
testNum: 42
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVVl-PozYQ_zTkZQQCA5vwkIcsaapKe7vV9a6vkQGT-GpwZJvLbT99xwZCSLIrNbIIZv7_ZjyeQlbv6--atwfo3HPTGdlQw0v4ymqmWFsyyGXXGkukbQXeU-i_RfgEqaBgxjAF8mR4w_9FMdkOenJB8RklQRikljNKgxBUGUFJO800lIJqDQ0zR1lpUMx0qu1NwFvxIwdZ_GClAfN-YmAkUHGm7yMfUGg7IeAkeYvmAy_ceuGmf347cg1nqf5BE1Ip1CHe4czNcfQo9khuHTofWQutNGPcX_NrQv_RxRq6WK8iDODLnds5nBQyGP6TOZ81UMWcelrX6ASrbrxkUEsh5NkKl7JiqOukZNWVKGqQyrXumBdvrqXQkX4hOOXwicS8LUWHCrw416biMjh68W8TtTlJZcAjxAmRnbK5bBhyEXKtfL-nxihedIbt9x5Z4bISeyWl2btseSSzq5dJQod9TbE-vjFtMGngLZ-BV-g69eJn3G1HL3BDVvmgo9cVP8-IvEKK6fXc0krZagPlkSrcbQa-v4y609GagfjaNRMxCVlbzWBE35uTYA1rTV-yQwAfu2tDG1VkQxFqJurJyk2w1_HMhBGfy-d4C-gL5sHat-mIJz4sp9bULg9kKrMLQhsIf3kkPXlp3lpJLN2RhimK75y9g_bG348wfhQ42quxpt7BnOXM61sMrvPxSFHySPYuXagGGspbh0X2CMy8T5GFM30ei7Evs3T7EagXQQsmQqnBfUdIEcAJVadmf2DmlTYMOSYxexpymO2vTF3OBNnM8j05OKbkcxf_X7bnabzk8N6wPT6fG3YHrEfmxqylzM3aFF3yfG_MHsfPjbkD64xVN8YsZWZsXkLhgwoau-S1xHPHRYWNtmnwDpva6g0rIbmlpfmfSh4UbWDHBbPhv7z8_cWPEnwrsBDTvLR3CbKD_8cgIXhh2yXB17Eh-y_3NHwFv7Y7f2jEiNeh7bRhJ5_gFTkQqSrxFW9KX6C7W4HO-8JSwH9Dq9JhE7BfrH9pPgn9rTOnznwU8-wYTEW7CvG33O2W-Xa5i6J0den8HzSjTZYts10S9j-STNovLOHNDwAN7XDZq-uyQB9lh-EW7FOtQ3lOjehCGWopITfxLtg6ekqzZRTGcbio1nGVxRldGG4EW2PF_v763Y0eWKqX6QVv5YNiWuMlYXXOh5b5TNJyMQ4tbtzAgcLNS9eTw6JTYn005mTR7mM_IG9XBFiZuBHi5_jn4zRgleHWjQLYX3bpU5aSxXG9Kp-iKivjLKzSMK2SMkoYLeqIpgWLijBdCFowoW1QGMyCr0lISLgK0yiJV0kW0DheZXizLdMkTbIltT0XO6wIrOFAqsNCrZ0PRXfQSBRcGz0REQN-aBkb9dMO8VBrHB7wUq0Xzt218_U_e6kOMA">