From: Nicolai Stange <nicstange@gmail.com>
To: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Cc: Nicolai Stange <nicstange@gmail.com>,
linux-sparse@vger.kernel.org, Christopher Li <sparse@chrisli.org>,
Josh Triplett <josh@joshtriplett.org>
Subject: Re: [PATCH v2 02/13] expression: examine constness of casts at evaluation only
Date: Tue, 26 Jan 2016 17:11:23 +0100 [thread overview]
Message-ID: <87fuxkb9sk.fsf@gmail.com> (raw)
In-Reply-To: <20160125220239.GD43341@macpro.local> (Luc Van Oostenryck's message of "Mon, 25 Jan 2016 23:02:40 +0100")
Luc Van Oostenryck <luc.vanoostenryck@gmail.com> writes:
> On Mon, Jan 25, 2016 at 03:51:03PM +0100, Nicolai Stange wrote:
>> Currently, the propagation of expressions' constness flags through
>> cast expressions is done in two steps:
>> - Several flags are speculatively set at cast expression parsing time
>> - and possibly cleared again at evaluation time.
>>
>> Set aside this unfortunate split of code, the early propagation of
>> constness flags is not able to recognize constant expressions such as
>> (int)__builtin_choose_expr(0, 0, 0)
>> since the final expression to be thrown into the cast is known only
>> after evaluation.
>>
>> Move the whole calculation of cast expressions' constness flags to the
>> evaluation phase.
>>
>> Introduce support for tracking arithmetic constness propagation through
>> cast expressions.
>>
>> Introduce support for recognizing address constants created by casting
>> an integer constant to pointer type.
>
>
> The description show that 3 things are done in the patch.
> Can it be splitted in 3?
That tracking "arithmetic constness propagation" is a stupid assertion anyway
since it is an implication of the change listed before ("calculate
constness at evaluation"). I'll drop that or rewrite it.
And yes, the third thing should be a separate patch.
>
> Also, it describes the current situation and what is changed but the
> 'why' part is not so clear.
>
Well, because I want (int)__builtin_choose_expr(0, 0, 0) to being
recognized as being a constant expression?
> The changes themselves are very fine.
> And the comments help :)
>
> Luc
>
>> Signed-off-by: Nicolai Stange <nicstange@gmail.com>
>> ---
>> evaluate.c | 42 ++++++++++++++++++++++++++++++------------
>> expression.c | 19 -------------------
>> validation/constexpr-cast.c | 25 +++++++++++++++++++++++++
>> 3 files changed, 55 insertions(+), 31 deletions(-)
>> create mode 100644 validation/constexpr-cast.c
>>
>> diff --git a/evaluate.c b/evaluate.c
>> index 0cf85ae..11917ee 100644
>> --- a/evaluate.c
>> +++ b/evaluate.c
>> @@ -323,7 +323,6 @@ static struct expression * cast_to(struct expression *old, struct symbol *type)
>> }
>>
>> expr = alloc_expression(old->pos, EXPR_IMPLIED_CAST);
>> - expr->flags = old->flags;
>> expr->ctype = type;
>> expr->cast_type = type;
>> expr->cast_expression = old;
>> @@ -2742,17 +2741,36 @@ static struct symbol *evaluate_cast(struct expression *expr)
>>
>> class1 = classify_type(ctype, &t1);
>>
>> - /* cast to non-numeric type -> not an arithmetic expression */
>> - if (!(class1 & TYPE_NUM))
>> - expr_clear_flag(&expr->flags, EXPR_FLAG_ARITH_CONST_EXPR);
>> - /* cast to float type -> not an integer constant expression */
>> - else if (class1 & TYPE_FLOAT)
>> - expr_clear_flag(&expr->flags, EXPR_FLAG_INT_CONST_EXPR);
>> - /* if argument turns out to be not an integer constant expression *and*
>> - it was not a floating literal to start with -> too bad */
>> - else if (!(target->flags &
>> - (EXPR_FLAG_INT_CONST_EXPR | EXPR_FLAG_FP_CONST)))
>> - expr_clear_flag(&expr->flags, EXPR_FLAG_INT_CONST_EXPR);
>> + if (!(class1 & TYPE_NUM)) {
>> + /*
>> + * Casts of integer literals to pointer type yield
>> + * address constants [6.6(9)].
>> + */
>> + if (class1 & TYPE_PTR &&
>> + (target->flags & EXPR_FLAG_INT_CONST)) {
>> + expr_set_flag(&expr->flags, EXPR_FLAG_ADDR_CONST_EXPR);
>> + }
>> + } else {
>> + expr->flags = target->flags;
>> + expr_flags_decay_consts(&expr->flags);
>> + /*
>> + * Casts to numeric types never result in address
>> + * constants [6.6(9)].
>> + */
>> + expr_clear_flag(&expr->flags, EXPR_FLAG_ADDR_CONST_EXPR);
>> + /*
>> + * Cast to float type -> not an integer constant
>> + * expression [6.6(6)].
>> + */
>> + if (class1 & TYPE_FLOAT)
>> + expr_clear_flag(&expr->flags, EXPR_FLAG_INT_CONST_EXPR);
>> + /*
>> + * Casts of float literals to integer type results in
>> + * a constant integer expression [6.6(6)].
>> + */
>> + else if (target->flags & EXPR_FLAG_FP_CONST)
>> + expr_set_flag(&expr->flags, EXPR_FLAG_INT_CONST_EXPR);
>> + }
>>
>> /*
>> * You can always throw a value away by casting to
>> diff --git a/expression.c b/expression.c
>> index eccdb5a..33f4581 100644
>> --- a/expression.c
>> +++ b/expression.c
>> @@ -725,25 +725,6 @@ static struct token *cast_expression(struct token *token, struct expression **tr
>> if (!v)
>> return token;
>> cast->cast_expression = v;
>> -
>> - cast->flags = v->flags;
>> - expr_flags_decay_consts(&cast->flags);
>> - /*
>> - * Up to now, we missed the (int).0 case here
>> - * which should really get a
>> - * EXPR_FLAG_INT_CONST_EXPR marker. Also,
>> - * conversion to non-numeric types is not
>> - * properly reflected up to this point.
>> - * However, we do not know until evaluation.
>> - * For the moment, in order to preserve
>> - * semantics, speculatively set
>> - * EXPR_FLAG_INT_CONST_EXPR if
>> - * EXPR_FLAG_FP_CONST is set. evaluate_cast()
>> - * will unset inappropriate flags again after
>> - * examining type information.
>> - */
>> - if (v->flags & EXPR_FLAG_FP_CONST)
>> - cast->flags |= EXPR_FLAG_INT_CONST_EXPR;
>> return token;
>> }
>> }
>> diff --git a/validation/constexpr-cast.c b/validation/constexpr-cast.c
>> new file mode 100644
>> index 0000000..2706961
>> --- /dev/null
>> +++ b/validation/constexpr-cast.c
>> @@ -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
>> + [(int)(float)0.] = 0, // KO
>> +
>> + [(int)(void*)0] = 0, // KO
>> + [(int)(void*)0.] = 0, // KO
>> +
>> +};
>> +/*
>> + * check-name: Expression constness propagation in casts
>> + *
>> + * check-error-start
>> +constexpr-cast.c:9:11: error: bad integer constant expression
>> +constexpr-cast.c:10:11: error: bad integer constant expression
>> +constexpr-cast.c:12:11: error: bad integer constant expression
>> +constexpr-cast.c:13:11: error: bad integer constant expression
>> + * 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@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2016-01-26 16:11 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-25 14:47 [PATCH v2 00/13] improve constexpr handling Nicolai Stange
2016-01-25 14:49 ` [PATCH v2 01/13] expression: introduce additional expression constness tracking flags Nicolai Stange
2016-01-25 21:51 ` Luc Van Oostenryck
2016-01-26 15:26 ` Nicolai Stange
2016-01-26 15:37 ` Nicolai Stange
2016-01-25 14:51 ` [PATCH v2 02/13] expression: examine constness of casts at evaluation only Nicolai Stange
2016-01-25 22:02 ` Luc Van Oostenryck
2016-01-26 16:11 ` Nicolai Stange [this message]
2016-01-25 14:52 ` [PATCH v2 03/13] expression: examine constness of binops and alike " Nicolai Stange
2016-01-26 0:14 ` Luc Van Oostenryck
2016-01-26 15:50 ` Nicolai Stange
2016-01-26 17:24 ` Luc Van Oostenryck
2016-01-27 10:42 ` Nicolai Stange
2016-01-27 18:00 ` Luc Van Oostenryck
2016-01-26 0:59 ` Luc Van Oostenryck
2016-01-25 14:53 ` [PATCH v2 04/13] expression: examine constness of preops " Nicolai Stange
2016-01-26 1:10 ` Luc Van Oostenryck
2016-01-25 14:55 ` [PATCH v2 05/13] expression: examine constness of conditionals " Nicolai Stange
2016-01-26 1:16 ` Luc Van Oostenryck
2016-01-25 14:56 ` [PATCH v2 06/13] expression, evaluate: add support for recognizing address constants Nicolai Stange
2016-01-26 1:27 ` Luc Van Oostenryck
2016-01-26 3:10 ` Luc Van Oostenryck
2016-01-25 14:57 ` [PATCH v2 07/13] evaluate: check static storage duration objects' intializers' constness Nicolai Stange
2016-01-26 1:42 ` Luc Van Oostenryck
2016-01-26 16:08 ` Nicolai Stange
2016-01-26 17:56 ` Luc Van Oostenryck
2016-01-26 20:18 ` Luc Van Oostenryck
2016-02-01 3:00 ` Nicolai Stange
2016-01-25 14:59 ` [PATCH v2 08/13] expression: recognize references to labels as address constants Nicolai Stange
2016-01-26 1:45 ` Luc Van Oostenryck
2016-01-25 15:00 ` [PATCH v2 09/13] expression: examine constness of __builtin_offsetof at evaluation only Nicolai Stange
2016-01-26 1:57 ` Luc Van Oostenryck
2016-02-01 3:06 ` Nicolai Stange
2016-01-25 15:02 ` [PATCH v2 10/13] symbol: flag builtins constant_p, safe_p and warning as constexprs Nicolai Stange
2016-01-26 2:00 ` Luc Van Oostenryck
2016-01-25 15:03 ` [PATCH v2 11/13] evaluate: relax some constant expression rules for pointer expressions Nicolai Stange
2016-01-26 2:05 ` Luc Van Oostenryck
2016-01-25 15:04 ` [PATCH v2 12/13] expression, evaluate: support compound literals as address constants Nicolai Stange
2016-01-26 2:07 ` Luc Van Oostenryck
2016-01-25 15:05 ` [PATCH v2 13/13] symbol: do not inherit storage modifiers from base types at examination Nicolai Stange
2016-01-26 2:54 ` Luc Van Oostenryck
2016-01-25 21:01 ` [PATCH v2 00/13] improve constexpr handling Luc Van Oostenryck
2016-01-25 21:26 ` Nicolai Stange
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87fuxkb9sk.fsf@gmail.com \
--to=nicstange@gmail.com \
--cc=josh@joshtriplett.org \
--cc=linux-sparse@vger.kernel.org \
--cc=luc.vanoostenryck@gmail.com \
--cc=sparse@chrisli.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).