Libc++ provides valarray transcendentals with replacement types. These functions are implemented either as template<class _Expr> or template<class _Expr1, class _Expr2>, where _Expr can be __val_expr or valarray.
The patch provides additional function templates for valarray transcendentals that as a parameter use _Tp which is a type of elements in the valarray. This is required by the standard and is needed if the user tries to explicitly instantiate the transcendental functions using _Tp, for example, std::abs<int>(int_valarray).
New templates do not take an additional _Expr parameter and so the functions accept only valarray as their parameter. This means that if the user explicitly instantiates these function templates and passes __val_expr to them, it first needs to be converted to valarray and the benefit of the expression template optimization is not present. No performance is lost in the currently possible case where template parameters are deduced because using __val_expr as an argument will lead to instantiation of the already present templates.