[all-commits] [llvm/llvm-project] 5aeaab: [Concepts] Check constraints for explicit template...

royjacobson via All-commits all-commits at lists.llvm.org
Thu Mar 3 06:34:07 PST 2022


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 5aeaabf35eaddf9e5bfb05c0ec901a8aecfaa36a
      https://github.com/llvm/llvm-project/commit/5aeaabf35eaddf9e5bfb05c0ec901a8aecfaa36a
  Author: Roy Jacobson <roi.jacobson1 at gmail.com>
  Date:   2022-03-03 (Thu, 03 Mar 2022)

  Changed paths:
    M clang/lib/Sema/SemaTemplateInstantiate.cpp
    A clang/test/AST/constraints-explicit-instantiation.cpp

  Log Message:
  -----------
  [Concepts] Check constraints for explicit template instantiations

The standard requires[0] member function constraints to be checked when
explicitly instantiating classes. This patch adds this constraints
check.

This issue is tracked as #46029 [1].

Note that there's an related open CWG issue (2421[2]) about what to do when
multiple candidates have satisfied constraints. This is particularly an
issue because mangling doesn't contain function constraints, and so the
following code still ICEs with definition with same mangled name
'_ZN1BIiE1fEv' as another definition:

template<class T>
struct B {
  int f() requires std::same_as<T, int> {
    return 0;
  }
  int f() requires (std::same_as<T, int> &&
                    !std::same_as<T, char>) {
    return 1;
  }
};

template struct B<int>;

Also note that the constraints checking while instantiating *functions*
is still not implemented. I started looking at it but It's a bit more
complicated. I believe in such a case we have to consider the partial
constraints order and potentially choose the best candidate out of the
set of multiple valid ones.

[0]: https://eel.is/c++draft/temp.explicit#10
[1]: https://github.com/llvm/llvm-project/issues/46029
[2]: https://cplusplus.github.io/CWG/issues/2421.html

Differential Revision: https://reviews.llvm.org/D120255




More information about the All-commits mailing list