ilya-biryukov added a comment.

In D127487#3573180 <https://reviews.llvm.org/D127487#3573180>, @erichkeane 
wrote:

> I'm not quite understanding this yet, so I'll have to take another look early 
> next week.  However, I AM intending to get https://reviews.llvm.org/D126907 
> committed in the next week or so.  Could you perhaps see how it interacts 
> with that?  Its a sizable, multi-month project that I'd like to make sure 
> doesn't get stuck in a rebase-loop again.

Sure, I will try to rebase my patch on top of your work and report what happens.



================
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));
----------------
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.


================
Comment at: clang/lib/Sema/SemaTemplateInstantiate.cpp:2042
+        !SemaRef.CheckConstraintExpression(TransConstraint.get())) {
+      assert(Trap.hasErrorOccurred() && "CheckConstraintExpression failed, but 
"
+                                        "did not produce a SFINAE error");
----------------
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.


================
Comment at: clang/test/SemaTemplate/concepts-PR54629.cpp:10
+int main() {
+  A<int> a;
+}
----------------
erichkeane wrote:
> Simply 'doesn't crash' isn't quite enough for a test here, I would like to 
> see some level of confirmation which of the versions of "A" get selected 
> here.  So perhaps `A<double>{}.some_func();` call that wouldn't be valid/etc. 
>  And perhaps a situation where both instances  have a constraint and and we 
> diagnose why it doesn't fit?
> 
> 
> 
I have added the test for primary template vs specialization.
Keeping a comment open to add a test for two specializations too, I will do 
this a bit later.


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