ZequanWu wrote: This change makes the following code no longer compile: ``` #include <concepts> #include <iterator>
template <typename T, typename It> concept CompatibleIter = std::contiguous_iterator<It>; template <typename T> class span { public: template <typename It> requires(CompatibleIter<T, It>) constexpr span(It first, int count) noexcept { } }; void foo(int n) { int vla[n]; span<const int> s(vla, n); } ``` ``` $ clang++ span.cpp -c -std=c++20 span.cpp:18:11: warning: variable length arrays in C++ are a Clang extension [-Wvla-cxx-extension] 18 | int vla[n]; | ^ span.cpp:18:11: note: function parameter 'n' with unknown value cannot be used in a constant expression span.cpp:17:14: note: declared here 17 | void foo(int n) { | ^ span.cpp:19:19: error: no matching constructor for initialization of 'span<const int>' 19 | span<const int> s(vla, n); | ^ ~~~~~~ span.cpp:12:13: note: candidate template ignored: constraints not satisfied [with It = int *] 12 | constexpr span(It first, int count) noexcept { | ^ span.cpp:11:14: note: because 'CompatibleIter<const int, int *>' evaluated to false 11 | requires(CompatibleIter<T, It>) | ^ span.cpp:5:26: note: because 'int *' does not satisfy 'contiguous_iterator' 5 | concept CompatibleIter = std::contiguous_iterator<It>; | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:697:35: note: because 'int *' does not satisfy 'random_access_iterator' 697 | concept contiguous_iterator = random_access_iterator<_Iter> | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:681:38: note: because 'int *' does not satisfy 'bidirectional_iterator' 681 | concept random_access_iterator = bidirectional_iterator<_Iter> | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:671:38: note: because 'int *' does not satisfy 'forward_iterator' 671 | concept bidirectional_iterator = forward_iterator<_Iter> | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:666:32: note: because 'int *' does not satisfy 'input_iterator' 666 | concept forward_iterator = input_iterator<_Iter> | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:655:30: note: because 'int *' does not satisfy 'input_or_output_iterator' 655 | concept input_iterator = input_or_output_iterator<_Iter> | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:635:5: note: because 'int *' does not satisfy 'weakly_incrementable' 635 | && weakly_incrementable<_Iter>; | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/iterator_concepts.h:619:36: note: because 'int *' does not satisfy 'movable' 619 | concept weakly_incrementable = movable<_Iter> | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/concepts:265:10: note: because 'assignable_from<int *&, int *>' evaluated to false 265 | && assignable_from<_Tp&, _Tp> && swappable<_Tp>; | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/concepts:143:44: note: because 'same_as<expr-type, int *&>' would be invalid 143 | { __lhs = static_cast<_Rhs&&>(__rhs) } -> same_as<_Lhs>; | ^ span.cpp:8:7: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided 8 | class span { | ^~~~ span.cpp:8:7: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided 8 | class span { | ^~~~ 1 warning and 1 error generated. ``` Can you revert it if it takes a while to fix? https://github.com/llvm/llvm-project/pull/101782 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits