rjmccall added inline comments.
================ Comment at: clang/lib/Sema/Sema.cpp:1508 void checkFunc(SourceLocation Loc, FunctionDecl *FD) { + auto DiagsCountIt = DiagsCount.find(FD); FunctionDecl *Caller = UseStack.empty() ? nullptr : UseStack.back(); ---------------- yaxunl wrote: > rjmccall wrote: > > yaxunl wrote: > > > rjmccall wrote: > > > > It makes me a little uncomfortable to be holding an iterator this long > > > > while calling a fair amount of other stuff in the meantime. > > > > > > > > Your use of DiagsCount is subtle enough that it really needs to be > > > > explained in some comments. You're doing stuff conditionally based on > > > > both whether the entry exists but also whether it's non-zero. > > > added comments > > Okay, thanks for that. Two points, then. First, it looks like the count > > is really just a boolean for whether the function recursively triggers any > > diagnostics. And second, can't it just be as simple as whether we've > > visited that function at all in a context that's forcing diagnostics to be > > emitted? The logic seems to be to try to emit the diagnostics for each > > use-path, but why would we want that? > For the second comment, we need to visit a function again for each use-path > because we need to report each use-path that triggers a diagnostic, otherwise > users will see a new error after they fix one error, instead of seeing all > the errors at once. > > For the first comment, I will change the count to two flags: one for the case > where the function is not in device context, the other is for the case where > the function is in device context. This will allow us to avoid redundant > visits whether or not we are in a device context. > For the second comment, we need to visit a function again for each use-path > because we need to report each use-path that triggers a diagnostic, otherwise > users will see a new error after they fix one error, instead of seeing all > the errors at once. This is not what we do in analogous cases where errors are triggered by a use, like in template instantiation. The bug might be that the device program is using a function that it shouldn't be using, or the bug might be that a function that's supposed to be usable from the device is written incorrectly. In the former case, yes, not reporting the errors for each use-path may force the programmer to build multiple times to find all the problematic uses. However, in the latter case you can easily end up emitting a massive number of errors that completely drowns out everything else. It's also non-linear: the number of different use-paths of a particular function can be combinatoric. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D77028/new/ https://reviews.llvm.org/D77028 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits