sammccall added a comment.

Fantastic :-)

@rsmith and others: would appreciate feedback on giving this a feature-flag (to 
decouple from LangOpts.CPlusPlus):

- whether it's OK to have one
- whether it should be cc1-only
- the name `-f[no]recovery-ast`



================
Comment at: clang/include/clang/AST/Expr.h:5920
+///
+/// RecoveryExpr is type-, value- and instantiation-dependent to take advantage
+/// of existing machinery to deal with dependent code in C++, e.g. RecoveryExpr
----------------
AIUI this should be "for now" with the goal of eliminating the use of template 
dependence concepts, right?


================
Comment at: clang/include/clang/AST/Expr.h:5935
+                              SourceLocation EndLoc, ArrayRef<Expr *> 
SubExprs);
+  static RecoveryExpr *CreateEmpty(ASTContext &Ctx, unsigned NumStmts);
+
----------------
nit: NumStmts -> NumSubExprs?


================
Comment at: clang/lib/AST/ComputeDependence.cpp:460
+ExprDependence clang::computeDependence(RecoveryExpr *E) {
+  auto D = ExprDependence::TypeValueInstantiation | ExprDependence::Error;
+  for (auto *S : E->subExpressions())
----------------
Probably worth echoing with a FIXME: drop type+value+instantiation once Error 
is sufficient to suppress checks.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:18401
+  // FIXME: use containsErrors() to suppress unwanted diags in C.
+  if (!Context.getLangOpts().CPlusPlus)
+    return ExprError();
----------------
I think we should strongly consider a LangOption with an associated flag. (e.g. 
LangOptions.RecoveryAST, -f[no]recovery-ast).
If we're going to pay tho cost of letting expr creation fail, we might as well 
use it
Use cases:
 - Control rollout: we can check this in without (yet) flipping the flag on for 
all tools at once, if desired. If we flip the default and it causes problems 
for particular tools, we can turn it off for that tool rather than rolling the 
whole thing back.
 - turn on and off in lit tests to precisely test behavior and avoid dependence 
on defaults
 - allow incremental work on recovery in !CPlusPlus mode

If this makes sense to you, I'd suggest setting the default to off in this 
patch (and including some tests that pass `-frecovery-ast`), and then 
immediately following up with a patch that flips the default to on-for-C++.
This separation makes like easier for everyone if turning this on breaks 
something.

A bunch of the updates to existing tests would be deferred until that patch.


================
Comment at: clang/lib/Sema/TreeTransform.h:9470
+ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
+  return E;
+}
----------------
rsmith wrote:
> ilya-biryukov wrote:
> > rsmith wrote:
> > > We should either transform the subexpressions or just return 
> > > `ExprError()` here. With this approach, we can violate AST invariants 
> > > (eg, by having the same `Expr` reachable through two different code paths 
> > > in the same function body, or by retaining `DeclRefExpr`s referring to 
> > > declarations from the wrong context, etc).
> > Thanks, I just blindly copied what TypoExpr was doing without considering 
> > the consequences here.
> > 
> > 
> > Added the code to rebuild `RecoveryExpr`.
> > 
> > Any good way to test this?
> Hmm, testing that the old failure mode doesn't happen seems a bit tricky; any 
> test for that is going to be testing second-order effects of the code under 
> test, so will be fragile. But you can test that we're substituting into the 
> `RecoveryExpr` easily enough: put some expression for which substitution will 
> fail into a context where we'll build a `RecoveryExpr` inside a context that 
> we'll `TreeTransform`. For example, maybe:
> 
> ```
> template<typename T> int *p = &void(T::error); // should produce "cannot take 
> address of void"
> int *q = p<int>; // should produce "'int' cannot be used prior to '::'" in 
> instantiation
> ```
@hokein I don't think this test was added yet.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D69330



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

Reply via email to