ilya-biryukov added a comment.

It seems wrong to change semantics of initialization when instantiating concept 
requirements. It implies that semantic checking may behave differently inside 
requires expressions, this is a red flag.
Clang has a mechanism 
<https://github.com/llvm/llvm-project/blob/84d07d021333f7b5716f0444d5c09105557272e0/clang/lib/Sema/SemaOverload.cpp#L7429>
 to prevent recursion when considering user-defined conversion for copy 
initialization.

Currently the intention of the Clang code path that handles this case is to:

1. Deduce `TO` to be `Deferred`
2. Try to check `Numeric<Deferred>`,
3. Check conversions during overload resolution for `foo(a)`. Go to step 1, 
<infinite recursion, so we never get to the next step>
4. <never reached> Check 
<https://github.com/llvm/llvm-project/blob/84d07d021333f7b5716f0444d5c09105557272e0/clang/lib/Sema/SemaOverload.cpp#L7429>
 that conversion operator converts the type to itself and mark the candidate as 
failed.

If move the check in step 4 to happen before step 3 (even if we need to 
duplicate the check), we will get the desired semantics.

Does that look reasonable?

I also agree there is a more general issue with recursive concept 
instantiations at play here, e.g. for code like

  template <class T> concept A = requires (T a) { foo(a); };
  template <class T> concept B = requires (T a) { bar(a); };
  
  struct X {};
  template <A T> void bar(T);
  template <B T> void foo(T);
  
  void test() {
      foo(X());
  }

Clang will currently cut this out because the template instantiation depth is 
too high, whereas GCC will provide a useful diagnostics that says concept 
satisfaction computation is recursive.
We probably want a more informative error message too. Probably worth 
investigating separately from that particular change.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D133052

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

Reply via email to