I have prepared a proposed fix against #16889, with regression tests. In defaultOClass, the S_CODE path installs a synthetic zero initializer before the translation unit has been fully parsed. This makes the tentative definition appear initialized, so addSymChain later rejects the actual initialized definition as a duplicate. Removing that synthetic initializer alone is not sufficient. After functions ,flushStatics() is called, which can emit the object before its later definition is encountered....
SM83: static const tentative definition incorrectly rejected as duplicate symbol