lanza added a comment.

> I don't think it'll actually error out at link time: protocol objects get 
> emitted eagerly on use, cross-module linking is just a code-size 
> optimization. This actually has caused longstanding problems.

But if it's just a forward declaration there's nothing to emit. The above code 
compiles just fine as is with just a warning. Here's the result of `clang 
protocol.m -lobjc`

  proto.m:10:31: warning: cannot find protocol definition for 'NonRuntimeProto'
  @interface Implementer : Root<NonRuntimeProto>
                                ^
  proto.m:8:11: note: protocol 'NonRuntimeProto' has no definition
  @protocol NonRuntimeProto;
            ^
  1 warning generated.
  Undefined symbols for architecture x86_64:
    "__OBJC_PROTOCOL_$_NonRuntimeProto", referenced from:
        __OBJC_CLASS_PROTOCOLS_$_Implementer in proto-bd4a43.o
  ld: symbol(s) not found for architecture x86_64
  clang-12: error: linker command failed with exit code 1 (use -v to see 
invocation)

The protocol definition isn't actually required to compile an implementation. 
And if that protocol is declared as `objc_non_runtime_protocol` it won't ever 
see one.

Simply requiring that it is annotated accordingly also isn't satisfactory for 
the same inheritance problem you mentioned above

  __attribute__((objc_non_runtime_protocol))
  @protocol SomeProto;

can tell clang not to emit it but won't let clang know if there's a base 
protocol that still needs to be emitted. e.g. if we have

  @protocol Base
  @end
  __attribute__((objc_non_runtime_protocol))
  @protocol SomeProto <SomeBaseProtol>


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D75574/new/

https://reviews.llvm.org/D75574

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to