[PATCH] D50360: [Concepts] Requires Expressions

Saar Raz via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 5 12:10:59 PST 2019


saar.raz added inline comments.


================
Comment at: lib/Sema/SemaTemplateInstantiate.cpp:1021-1052
+    ExprResult TransformRequiresExpr(RequiresExpr *E) {
+      LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
+      return TreeTransform<TemplateInstantiator>::TransformRequiresExpr(E);
+    }
+
+    bool TransformRequiresExprRequirements(ArrayRef<Requirement *> Reqs,
+        SmallVectorImpl<Requirement *> &Transformed) {
----------------
rsmith wrote:
> Do we really need to duplicate the `TreeTransform` code here, and add a representation for a requirement whose substitution failed, and so on?
> 
> Possible alternative: create a `SFINAETrap` for the entire requires-expression, perform a `TreeTransform` of the whole thing, and if it fails, capture the diagnostic and build a `FailedRequiresExpr` node that stores the diagnostic and evaluates to `false`. (Under this model, a non-value-dependent `RequiresExpr` would always evaluate to `true`.) That should simplify this code, and the representations of `RequiresExpr` and `Requirements` (since you don't need to model "substitution failed" any more, nor conditionally store a diagnostic on a requirement).
> 
> Are there cases where we want to retain more information than that? (I don't think there are, since you don't actually retain any useful information from the requirement that failed, other than the diagnostic itself, but maybe I've missed something.) The results of a successful substitution into some parts of a failed `RequiresExpr` don't really seem interesting.
Wouldn't it be interesting to store the successful requirements prior to the failed ones? I imagine some tools might want this information


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D50360





More information about the cfe-commits mailing list