[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