As an extension, GCC allows labels to be referenced a la label1: ... void *ptr = &&label1; Tag these label references as being address constants allowing them to be used as initializers for objects of static storage duration. Signed-off-by: Nicolai Stange <nicstange@xxxxxxxxx> --- expression.c | 1 + validation/constexpr-labelref.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 validation/constexpr-labelref.c diff --git a/expression.c b/expression.c index 11fb9cd..ac6cf43 100644 --- a/expression.c +++ b/expression.c @@ -687,6 +687,7 @@ static struct token *unary_expression(struct token *token, struct expression **t sym->ctype.modifiers |= MOD_ADDRESSABLE; add_symbol(&function_computed_target_list, sym); } + label->constexpr_flags = CONSTEXPR_FLAG_ADDR_CONST; label->label_symbol = sym; *tree = label; return token->next->next; diff --git a/validation/constexpr-labelref.c b/validation/constexpr-labelref.c new file mode 100644 index 0000000..c51f9c8 --- /dev/null +++ b/validation/constexpr-labelref.c @@ -0,0 +1,15 @@ +static void a(void) +{ +label1: + ; + static void *b = &&label1; +} + +/* + * check-name: label reference constness verification. + * check-command: sparse -Wconstexpr-not-const $file + * + * check-error-start + * check-error-end + */ + -- 2.7.0 -- 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