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