[PATCH] D61722: [AST] Add RecoveryExpr; produce it on overload resolution failure and missing member.
Richard Smith - zygoloid via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 15 17:53:47 PDT 2019
rsmith added a comment.
I expect we'll want a `ContainsErrors` bit on `Stmt`, propagated similarly to the existing `InstantiationDependent` / `ContainsUnexpandedParameterPack` / ... bits. For example, the constant evaluator will want to quickly bail out of evaluating expressions and statements containing errors, and the error recovery `TreeTransform` that we perform to fix typos will want that too (and maybe could be able to fix other kinds of errors for which we build these error nodes eventually?).
================
Comment at: include/clang/AST/BuiltinTypes.def:265
+// a template.
+BUILTIN_TYPE(Recovery, RecoveryTy)
+
----------------
erik.pilkington wrote:
> Why are you creating a new type as opposed to just using DependentTy (sorta like TypoExpr does)? It seems like if you want to recycle all the dependence-propagating code in Sema, then you need to fall back to DependentTy anyways, i.e. `1 + <recovery-expr>` will have dependent type with this patch, right?
>
>
Using `DependentTy` for `TypoExpr` is a mistake; it leads to all sorts of bad follow-on diagnostics incorrectly claiming that constructs have dependent types.
Rather than calling this `RecoveryTy`, I'd prefer to call it something a bit more general like `ErrorTy`, with the intent being that we eventually use it for `TypoExpr` too.
================
Comment at: include/clang/AST/Expr.h:5801-5809
+/// RecoveryExpr - a broken expression that we couldn't construct an AST for,
+/// e.g. because overload resolution failed.
+/// We capture:
+/// - the kind of expression that would have been produced
+/// - the valid subexpressions
+/// - the type, if known. If unknown, it is the built-in RecoveryTy, which
+/// is dependent (and so generally suppresses further diagnostics etc).
----------------
Do we need this at all, if we have a properly-propagated `ErrorTy` anyway? Instead of using this, it would seem that we could model an ill-formed expression as the corresponding AST node but with its type set to `ErrorTy`. Presumably the latter is what we'll do when we find a subexpression containing an error, rather than creating a `RecoveryExpr` at every enclosing syntactic level, so AST clients will need to deal with that anyway.
================
Comment at: include/clang/AST/Type.h:2423-2424
+ : Type(Builtin, QualType(),
+ /*Dependent=*/(K == Dependent || K == Recovery),
+ /*InstantiationDependent=*/(K == Dependent || K == Recovery),
/*VariablyModified=*/false,
----------------
Experience with `TypoExpr` suggests that treating non-dependent constructs as dependent is a mistake in the long term.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D61722/new/
https://reviews.llvm.org/D61722
More information about the cfe-commits
mailing list