addDecl is making the ivar visible in its primary context. The primary context of the ivar here is
in a 'fragile' ABI the ObjCInterfaceDecl and in a 'non-fragile' ABI the current ObjCImplementationDecl.
The additional call to makeDeclVisibleInContext to make the ivar visible in the ObjCInterfaceDecl
is only necessary in the 'non-fragile' case (as in the 'fragile' case the Decl becomes automatically visible
in the ObjCInterfaceDecl with the addDecl call as thats its primary context). See Sema::ActOnIvar
for where the ivar is put into a different context depending on the ABI.
To put this into an example:
@implementation SomeClass { id ivar1; } @end fragile case: implicit ObjCInterfaceDecl 'SomeClass' `- ivar1 (in primary context and will be automatically made visible) ObjCImplementationDecl 'SomeClass' non-fragile case: implicit ObjCInterfaceDecl 'SomeClass' `-<<<ivar1 not visible here and needs to be manually marked as visible.>>> ObjCImplementationDecl 'SomeClass' `- ivar1 (in its primary context and will be automatically made visible here)
Making a Decl visible multiple times in the same context is inefficient and potentially
can lead to crashes. See D84827 for more info and what this is breaking.