aaron.ballman added a comment. In D90275#2371343 <https://reviews.llvm.org/D90275#2371343>, @jdoerfert wrote:
> The more I think about it, the more I think we should never create a > `leaf`/`nocallback` definition. Only declarations should carry that attribute. When talking about the IR that gets lowered to LLVM, I think that's very reasonable. When talking about the frontend, I'm a bit less certain. GCC and ICC both do not warn when you apply the attribute solely to a definition, so one concern is with code portability where existing code is harder to port into Clang. However, when I tried to find examples of the attribute being written on a definition, I couldn't spot any so this may not be a particularly large concern. Another potential concern is that a situation like this seems harmless and diagnosing the use on the definition seems user-unfriendly: // In a header file __attribute__((leaf)) void func(void); // In a source file __attribute__((leaf)) void func(void) { ... } The last concern is whether non-compiler-writing users will understand the behavior. // #1 __attribute__((leaf)) void func(void) {} // Declares and defines a function at the same time // #2 __attribute__((leaf)) void func(void); void func(void) {} // Inherits the attribute from the previous declaration I would suspect that users will see #1 and #2 as defining the same things and may be surprised if #1 is diagnosed but #2 is fine, but that's just a gut feeling without evidence backing it up. I'm not insisting that we accept the attribute on a definition, but if we do want to make a distinction in the frontend between declaration and definition, we should document it with some explicit examples. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D90275/new/ https://reviews.llvm.org/D90275 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits