dexonsmith accepted this revision.
dexonsmith added a comment.
This revision is now accepted and ready to land.

LGTM, since I don't think the parallel error paths are too bad in this specific 
patch, but see my longer comment inline.



================
Comment at: clang/lib/Frontend/CompilerInvocation.cpp:1196
                                 const std::vector<std::string> &Sanitizers,
                                 DiagnosticsEngine &Diags, SanitizerSet &S) {
+  bool Success = true;
----------------
jansvoboda11 wrote:
> dexonsmith wrote:
> > Can the caller use `Diags.hasErrorOccurred()` to avoid this change?
> Not really, because the caller might have `Diags` that already contains some 
> errors. We could compare the number of errors in `Diags` before and after 
> calling this function. `DiagnosticsEngine` doesn't have API for that, but 
> that could be added without much issues.
> 
> Do you have any specific reason for avoiding this change beyond minimizing 
> the diff?
> Not really, because the caller might have Diags that already contains some 
> errors. We could compare the number of errors in Diags before and after 
> calling this function. DiagnosticsEngine doesn't have API for that, but that 
> could be added without much issues.

Why not just return "failure" at the top level if any error has occurred? Why 
do we need to know if a specific parse routine failed?

If we have top-level callers that send in a DiagnosticEngine that has already 
been called, maybe we can change them to call `Reset` before entering.

> Do you have any specific reason for avoiding this change beyond minimizing 
> the diff? 

It's just fragile; it's a manual step to update Success every time an error is 
reported. Having two paths to give the same information is awkward and 
error-prone.

It'd be nice to have a hook that did both, so you could do something like:
```
reportError(diag::err_drv_invalid_value) << FlagName << Sanitizer;
```
and `reportError` would be something like:
```
auto reportError = [&Diags,&Success](OptSpecifier Opt) {
  Success = false;
  return Diags.Report(Opt);
};
```
or to ensure warnings in the same interface, maybe could have:
```
auto reportDiag = [&Diags,&Success](OptSpecifier Opt) {
  Success &= Diags.getDiagnosticLevel() >= DiagnosticsEngine::Error;
  return Diags.Report(Opt);
};
```
Not necessarily worth it for this patch (you can commit as-is), but if we're 
going to have to update swaths of code in this way it would be good to 
encapsulate the pattern somehow.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D95793

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

Reply via email to