erichkeane added inline comments.

================
Comment at: clang/lib/Sema/SemaConcept.cpp:352
+      [this](const Expr *AtomicExpr) -> ExprResult {
+        // We only do this to immitate lvalue-to-rvalue conversion.
+        return PerformContextuallyConvertToBool(const_cast<Expr*>(AtomicExpr));
----------------
ilya-biryukov wrote:
> erichkeane wrote:
> > Can you explain this more?  How does this work, and why don't we do that 
> > directly instead?
> That's entangled with `calculateConstraintSatisfaction`. I actually tried to 
> do it directly, but before passing expressions to this function 
> `calculateConstraintSatisfaction` calls `IgnoreParenImpCasts()`, which strips 
> away the lvalue-to-rvalue conversion.
> And we need this conversion so that the evaluation that runs after this 
> callback returns actually produces an r-value.
> 
> Note that the other call to `calculateConstraintSatisfaction` also calls 
> `PerformContextuallyConvertToBool` after doing template substitution into the 
> constraint expression.
> 
> I don't have full context on why it's the way it is, maybe there is a more 
> fundamental change that helps with both cases.
Hmm... my understanding is we DO need these to be a boolean expression 
eventually, since we have to test them as a bool, so that is why the other 
attempts the converesion.  If you think of any generalizations of this, it 
would be appreciated, I'll think it through as well.


================
Comment at: clang/lib/Sema/SemaTemplateInstantiate.cpp:2042
+        !SemaRef.CheckConstraintExpression(TransConstraint.get())) {
+      assert(Trap.hasErrorOccurred() && "CheckConstraintExpression failed, but 
"
+                                        "did not produce a SFINAE error");
----------------
ilya-biryukov wrote:
> erichkeane wrote:
> > This branch ends up being empty if asserts are off.  Also, it results in 
> > CheckConstraintExpression happening 2x, which ends up being more expensive 
> > after https://reviews.llvm.org/D126907
> > This branch ends up being empty if asserts are off.  Also, it results in 
> > CheckConstraintExpression happening 2x, which ends up being more expensive 
> > after https://reviews.llvm.org/D126907
> 
> Yeah, good point, I have update it.
> 
> I am not sure why would `CheckConstraintExpression` be called twice, could 
> you elaborate? Note that we do not call `BuildNestedRequirement` anymore and 
> use placement new directly to avoid extra template instantiations. Instead we 
> call `CheckConstraintExpression` directly to account for any errors.
This check does not seem to cause a 'return' to the function, but then falls 
through to the version on 2052, right?  

`CheckConstraintExpression`/`CheckConstraintSatisfaction`(i think?) ends up now 
having to re-instantiate every time it is called, so any ability to cache 
results ends up being beneficial here.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D127487

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

Reply via email to