[cfe-dev] warning request: partial array initialisation

Richard Smith richard at metafoo.co.uk
Tue Jun 19 15:53:15 PDT 2012


On Tue, Jun 19, 2012 at 3:17 PM, Sebastian Redl
<sebastian.redl at getdesigned.at> wrote:
>
> On 19.06.2012, at 18:49, Chandler Carruth wrote:
>
> On Tue, Jun 19, 2012 at 1:20 AM, Jay Foad <jay.foad at gmail.com> wrote:
>>
>> Hi,
>>
>> I'd really like to be able to get a warning when "almost all" elements
>> of an array are initialised:
>>
>>  #define N 8
>>  const int a[N] = { 3, 1, 4, 1, 5, 9, 2 };
>>  warning: some but not all array elements initialised
>
>
> At least in C++, this warning wouldn't make a lot of sense because all of
> the array elements *are* initialized. [dcl.init.aggr] 8.5.1/7: "If there are
> fewer initializers in the list than there are members in the aggregate, then
> each member not explicitly initialized shall be value-initialized (8.5)."
>
> We would have a problem with lots of code which intended to initialized the
> first few elements, and zero out the rest.
>
> Maybe someone has clever ideas about how to syntactically differentiate
> between these two use cases?
>
>
> const int a[] = { 3, 1, 4, 1, 5, 9, 2 };
> static_assert(arraysize(a) == N, "N was increased, you need more
> initializers");

Ooh, can I play?

// In a library...
struct end_t {} constexpr end {};
template<typename T> struct WithEnd { T a; end_t end; };

// error, no conversion from end_t to int
WithEnd<const int[N]> a = { 3, 1, 4, 1, 5, 9, 2, end };

... or ...

// In a library...
template<typename T, size_t...Ns> struct ArrImpl {
  constexpr ArrImpl(const decltype(Ns, declval<T>()) &...arg) : arr{arg...} {}
  T arr[sizeof...(Ns)];
};
template<typename T> struct ArrBuilder;
template<typename T, size_t N> struct ArrBuilder<T[N]> {
  typedef typename ArrBuilder<ArrImpl<T,N-1>>::type type;
};
template<typename T, size_t ...Ns> struct ArrBuilder<ArrImpl<T, 0, Ns...>> {
  typedef ArrImpl<T, 0, Ns...> type;
};
template<typename T, size_t N, size_t ...Ns> struct
ArrBuilder<ArrImpl<T, N, Ns...>> {
  typedef typename ArrBuilder<ArrImpl<T, N-1, N, Ns...>>::type type;
};
template<typename T> using Arr = typename ArrBuilder<T>::type;

// error, no matching constructor
Arr<const int[8]> a = { 1, 2, 3, 4, 5, 6, 7 };




More information about the cfe-dev mailing list