On Mon, Feb 1, 2016 at 10:28 AM, Nicolai Stange <nicstange@xxxxxxxxx> wrote: > Here comes the greatly enhanced v3 of this series. > > Luc's suggestions about splitting some patches turned out to be very fruitful! OK, I am taking a stab at his again. Sorry for the long hold off. I will reply from this thread instead of finding the right patch email to reply on. +++ validation/constexpr-cast.c 2016-11-23 09:57:37.638646787 +0800 @@ -0,0 +1,25 @@ +static int a[] = { + [(int)0] = 0, // OK + [(int)(int)0] = 0, // OK + [(int)0.] = 0, // OK + [(int)(int)0.] = 0, // OK + [(int)__builtin_choose_expr(0, 0, 0)] = 0, // OK + [(int)__builtin_choose_expr(0, 0, 0.)] = 0, // OK + + [(int)(float)0] = 0, // KO Why is this one KO? It seems perfectly fine to force a floating type into a integer constant expression. per [6.6.6] quote: on integer constant expression: " and floating constants that are the immediate operands of casts. Cast operators in an integer constant expression shall only convert arithmetic types to integer types," + [(int)(float)0.] = 0, // KO + + [(int)(void*)0] = 0, // KO Also this one should be fine? [6.7.8.6] quote as " If a designator has the form [ constant-expression ] then the current object (defined below) shall have array type and the expression shall be an *integer constant expression*." So it seems the only requirement is *integer constant expression*. why (int)(void*)0 is not integer constant expression? Sure there is a warning about converting the (void*) into (int) for a different size. But that is a separate issue. Chris -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html