This patch mostly adds unittests for ArrayRef and MutableArrayRef, additionnaly:
- We mimic the behavior of std::vector and disallow CV qualified type (ArrayRef<const X> is not allowed). This is to make sure that the type traits are always valid (e.g. value_type, pointer, ...).
- In the previous implementation ArrayRef would define value_type as const T but this is not correct, it should be T for both MutableArrayRef and ArrayRef.
- We add the equals method to ease testing,
- We define the constructor taking an Array outside of the base implementation to ensure we match const Array<T>& and not Array<const T>& in the case of ArrayRef.
Calling it equals is a bit misleading when we are comparing references. Unless this name is inspired from other places in llvm-project, may be name it equalData or something like that?