sberg added a comment. Since this commit (plus its follow-up https://github.com/llvm/llvm-project/commit/ce861ec782ae3f41807b61e855512aaccf3c2149 "[Clang][Sema] Add a temporary workaround in SemaConcept.cpp", to avoid `clang/lib/AST/ExprConstant.cpp:15332: bool clang::Expr::EvaluateAsConstantExpr(EvalResult &, const ASTContext &, ConstantExprKind) const: Assertion `!isValueDependent() && "Expression evaluator can't be called on a dependent expression."' failed` in `-DLLVM_ENABLE_ASSERTIONS=ON` builds):
$ cat test.cc #include <memory> #include <utility> #include <vector> std::vector<std::unique_ptr<int>> v1; std::vector<std::unique_ptr<int>> v2; void f() { v2.insert(v2.end(), std::make_move_iterator(v1.begin()), std::make_move_iterator(v1.end())); } $ clang++ -std=c++20 -fsyntax-only test.cc In file included from test.cc:1: In file included from /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/memory:66: In file included from /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_tempbuf.h:61: /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_construct.h:115:4: error: no matching function for call to 'construct_at' std::construct_at(__p, std::forward<_Args>(__args)...); ^~~~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:120:11: note: in instantiation of function template specialization 'std::_Construct<std::unique_ptr<int>, std::unique_ptr<int> &>' requested here std::_Construct(std::__addressof(*__cur), *__first); ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:371:14: note: in instantiation of function template specialization 'std::__do_uninit_copy<std::move_iterator<std::unique_ptr<int> *>, std::unique_ptr<int> *>' requested here return std::__do_uninit_copy(__first, __last, __result); ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:384:19: note: in instantiation of function template specialization 'std::__uninitialized_copy_a<std::move_iterator<std::unique_ptr<int> *>, std::unique_ptr<int> *, std::unique_ptr<int>>' requested here return std::__uninitialized_copy_a(_GLIBCXX_MAKE_MOVE_ITERATOR(__first), ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/vector.tcc:766:12: note: in instantiation of function template specialization 'std::__uninitialized_move_a<std::unique_ptr<int> *, std::unique_ptr<int> *, std::allocator<std::unique_ptr<int>>>' requested here std::__uninitialized_move_a(this->_M_impl._M_finish - __n, ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_vector.h:1481:4: note: in instantiation of function template specialization 'std::vector<std::unique_ptr<int>>::_M_range_insert<std::move_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<int> *, std::vector<std::unique_ptr<int>>>>>' requested here _M_range_insert(begin() + __offset, __first, __last, ^ test.cc:7:6: note: in instantiation of function template specialization 'std::vector<std::unique_ptr<int>>::insert<std::move_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<int> *, std::vector<std::unique_ptr<int>>>>, void>' requested here v2.insert(v2.end(), std::make_move_iterator(v1.begin()), std::make_move_iterator(v1.end())); ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_construct.h:94:5: note: candidate template ignored: substitution failure [with _Tp = std::unique_ptr<int>, _Args = <std::unique_ptr<int> &>]: call to deleted constructor of 'std::unique_ptr<int>' construct_at(_Tp* __location, _Args&&... __args) ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_construct.h:119:25: error: call to deleted constructor of 'std::unique_ptr<int>' ::new((void*)__p) _Tp(std::forward<_Args>(__args)...); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/unique_ptr.h:522:7: note: 'unique_ptr' has been explicitly marked deleted here unique_ptr(const unique_ptr&) = delete; ^ In file included from test.cc:1: In file included from /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/memory:69: /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:120:6: error: no matching function for call to '_Construct' std::_Construct(std::__addressof(*__cur), *__first); ^~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:371:14: note: in instantiation of function template specialization 'std::__do_uninit_copy<std::move_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<int> *, std::vector<std::unique_ptr<int>>>>, std::unique_ptr<int> *>' requested here return std::__do_uninit_copy(__first, __last, __result); ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/vector.tcc:781:12: note: in instantiation of function template specialization 'std::__uninitialized_copy_a<std::move_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<int> *, std::vector<std::unique_ptr<int>>>>, std::unique_ptr<int> *, std::unique_ptr<int>>' requested here std::__uninitialized_copy_a(__mid, __last, ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_vector.h:1481:4: note: in instantiation of function template specialization 'std::vector<std::unique_ptr<int>>::_M_range_insert<std::move_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<int> *, std::vector<std::unique_ptr<int>>>>>' requested here _M_range_insert(begin() + __offset, __first, __last, ^ test.cc:7:6: note: in instantiation of function template specialization 'std::vector<std::unique_ptr<int>>::insert<std::move_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<int> *, std::vector<std::unique_ptr<int>>>>, void>' requested here v2.insert(v2.end(), std::make_move_iterator(v1.begin()), std::make_move_iterator(v1.end())); ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_construct.h:109:5: note: candidate template ignored: substitution failure [with _Tp = std::unique_ptr<int>, _Args = <std::unique_ptr<int> &>] _Construct(_Tp* __p, _Args&&... __args) ^ In file included from test.cc:1: In file included from /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/memory:69: /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:90:21: error: static assertion failed due to requirement 'is_constructible<std::unique_ptr<int, std::default_delete<int>>, std::unique_ptr<int, std::default_delete<int>> &>::value': result type must be constructible from input type static_assert(is_constructible<_ValueType, _Tp>::value, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:182:4: note: in instantiation of function template specialization 'std::__check_constructible<std::unique_ptr<int>, std::unique_ptr<int> &>' requested here = _GLIBCXX_USE_ASSIGN_FOR_INIT(_ValueType2, _From); ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:101:13: note: expanded from macro '_GLIBCXX_USE_ASSIGN_FOR_INIT' && std::__check_constructible<T, U>() ^ /usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/stl_uninitialized.h:373:19: note: in instantiation of function template specialization 'std::uninitialized_copy<std::move_iterator<std::unique_ptr<int> *>, std::unique_ptr<int> *>' requested here return std::uninitialized_copy(__first, __last, __result); ^ 4 errors generated. (When building against `libstdc++-devel-13.1.1-1.fc38.x86_64` at least, but also when building against a GCC trunk libstdc++. And compilation succeeds with both GCC and older Clang, so it looks like an issue with this commit rather than with the used libstdc++.) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146178/new/ https://reviews.llvm.org/D146178 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits