The test.c below fails in clang-8, but works with gcc-8. It is natural that a slice array of equal size is initialized using the initializer list. It probably shouldn't fail, and implicitly use this operator: void std::slice_array::operator=(const std::valarray<T>& val_arr). FreeBSD 11.2 Yuri ---test.cpp--- #include <valarray> void f() { typedef std::valarray<double> matrix; matrix m; m[std::slice(2, 3, 3)] = {0.,0.,0.}; } ---message.txt--- valarray-ilist.cpp:6:26: error: no viable overloaded '=' m[std::slice(2, 3, 3)] = {0.,0.,0.}; ~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~ /usr/include/c++/v1/valarray:1258:24: note: candidate function not viable: cannot convert initializer list argument to 'const std::__1::slice_array<double>' const slice_array& operator=(const slice_array& __sa) const; ^ /usr/include/c++/v1/valarray:1261:10: note: candidate function not viable: cannot convert initializer list argument to 'const std::__1::slice_array<double>::value_type' (aka 'const double') void operator=(const value_type& __x) const; ^ /usr/include/c++/v1/valarray:1165:5: note: candidate template ignored: couldn't infer template argument '_Expr' operator=(const _Expr& __v) const; ^
This isn't a clang bug per se, it's a libc++ issue.