linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Nicolai Stange <nicstange@gmail.com>
To: Christopher Li <sparse@chrisli.org>
Cc: Nicolai Stange <nicstange@gmail.com>,
	Luc Van Oostenryck <luc.vanoostenryck@gmail.com>,
	Linux-Sparse <linux-sparse@vger.kernel.org>,
	Josh Triplett <josh@joshtriplett.org>
Subject: Re: [PATCH v3 00/21] improve constexpr handling
Date: Wed, 23 Nov 2016 19:33:01 +0100	[thread overview]
Message-ID: <87lgwa59nm.fsf@gmail.com> (raw)
In-Reply-To: <CANeU7QmsdVoccP0pN9RKkKC+-0mPSbfB59wQ5ngC3qEi4EY1+g@mail.gmail.com> (Christopher Li's message of "Thu, 24 Nov 2016 01:38:45 +0800")

Christopher Li <sparse@chrisli.org> writes:

> On Thu, Nov 24, 2016 at 12:43 AM, Nicolai Stange <nicstange@gmail.com> wrote:
>>
>> I don't think that this would qualify as a constant expression of any
>> type.
>>
>>> How about (void*)(0 + 'a') and (void*)0 + 'a', are they address constant
>>> or not?
>>
>> Strictly speaking, neither of them is.
>>
>> Despite of this, we would (hopefully) mark the second case as an address
>> constant though.
>>
>> Reason: this series flags address constants as such because they may be
>> used as a "constant expression in an initializer", i.e. as initializers
>> for static storage duration variables.
>
> That is good info. Thanks for the clarify.
>
> BTW, gcc does not seem to complain about const integer issue on,
>          [(int)(float)0] = 0,    // KO
>          [(int)(void*)0] = 0,    // KO
> gcc seems does what make snese rather than stick to the book.

To give you some background: when I started this, my initial intent was
to move the constness inspection from the expression building stage in
expression.c to their evaluation in evaluation.c. This would be needed
in order to decide whether the outcome of __builtin_choose_expr() is a
constant expression, for example.

While doing this, I recognized that sparse's current constant expression
tagging scheme was quite limited and I had to touch everything related
to it anyway. So I asked on this list on whether it would be a good
thing to let sparse be more strict than gcc in this regard and the
feedback was that it certainly would (at user option).


> In your patch:

Can you tell which one? If not, would resending this series help?

> static struct token *builtin_types_compatible_p_expr(struct token *token,
>                                                      struct expression **tree)
>  {
>         struct expression *expr = alloc_expression(
>                 token->pos, EXPR_COMPARE);
> -       expr->flags = Int_const_expr;
>         expr->op = SPECIAL_EQUAL;
>         token = token->next;
>         if (!match_op(token, '('))
>
> I think __builtin_xxx function expand similar to the processor
> macro. In that sense, we might want to the consider this expression
> as integer constant express as if the __builtin_xxx call is either 0 or 1.
>
> Again, gcc does not complain about:
>        [__builtin_types_compatible_p(typeof(1), int)] = 0,   // KO
>
> This makes sense, but not according the "strict" rules.

After [21/21] ("evaluation: treat comparsions between types as integer
constexpr"), sparse should treat __builtin_types_compatible_p() as an
integer constant expression, just as gcc does.

After all, the standard doesn't say anything about
__builtin_types_compatible_p()...

So, if the above testcase really fails after this series, it's either a
bug or an artifact of having this typeof() in there (or both), I
think.


>>>
>>> Basically, there are six bits as basic element. One bit per element.
>>> Integer constant, enum constant, char constant, float constant,
>>> address constant,
>>> arithmetic constant.
>>
>> + integer constant *expression*
>>
>> Take 0 + 0, for example: this is not an integer constant, but an integer
>> constant *expression* (and an arithmetic constant expression as well).
>
> Ah, I see. I change my plan according this. The six basic element define as:
> Integer constant, enum constant, char constant, float constant,
> address constant, composite op.
>
> The composite op bit get set after binary operation or uniop.
> The flags can have more than one bit set for the expression.
>
> Integer constant expression can be tested as:
>
> !(flags & ( Addr | Float) ) && flag
>
> Arithmetic constant expression can be tested as:
>
> !(flags & Addr) ) && flag
>
> Do you see any problem with this internal representation?

(int)0.0 is an integer constant expression.

In your scheme, it would have "composite op" and "float" set?
The integer constant expression test you proposed above would
fail in this case.


Thanks,

Nicolai

  parent reply	other threads:[~2016-11-23 18:33 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-01  2:28 [PATCH v3 00/21] improve constexpr handling Nicolai Stange
2016-02-01  2:29 ` [PATCH v3 01/21] expression: introduce additional expression constness tracking flags Nicolai Stange
2016-03-15 21:23   ` Luc Van Oostenryck
2016-02-01  2:30 ` [PATCH v3 02/21] expression: init constexpr_flags at expression allocation Nicolai Stange
2016-03-15 16:59   ` Luc Van Oostenryck
2016-02-01  2:31 ` [PATCH v3 03/21] expression: examine constness of casts at evaluation only Nicolai Stange
2016-03-15 20:43   ` Luc Van Oostenryck
2016-02-01  2:32 ` [PATCH v3 04/21] expression: examine constness of binops and alike " Nicolai Stange
2016-03-15 17:06   ` Luc Van Oostenryck
2016-02-01  2:33 ` [PATCH v3 05/21] expression: examine constness of preops " Nicolai Stange
2016-03-15 17:09   ` Luc Van Oostenryck
2016-02-01  2:34 ` [PATCH v3 06/21] expression: examine constness of conditionals " Nicolai Stange
2016-03-15 17:11   ` Luc Van Oostenryck
2016-02-01  2:35 ` [PATCH v3 07/21] expression: add support for tagging arithmetic constant expressions Nicolai Stange
2016-03-15 17:13   ` Luc Van Oostenryck
2016-02-01  2:36 ` [PATCH v3 08/21] expression, evaluate: add support for tagging address constants Nicolai Stange
2016-03-15 17:15   ` Luc Van Oostenryck
2016-02-01  2:37 ` [PATCH v3 09/21] evaluate: check static storage duration objects' intializers' constness Nicolai Stange
2016-03-15 17:28   ` Luc Van Oostenryck
2016-02-01  2:38 ` [PATCH v3 10/21] expression, evaluate: recognize static objects as address constants Nicolai Stange
2016-03-15 17:38   ` Luc Van Oostenryck
2016-02-01  2:39 ` [PATCH v3 11/21] evaluate: recognize address constants created through casts Nicolai Stange
2016-03-15 17:44   ` Luc Van Oostenryck
2016-02-01  2:39 ` [PATCH v3 12/21] evaluate: recognize address constants created through pointer arithmetic Nicolai Stange
2016-03-15 17:46   ` Luc Van Oostenryck
2016-02-01  2:40 ` [PATCH v3 13/21] evaluate: recognize members of static compound objects as address constants Nicolai Stange
2016-03-15 17:46   ` Luc Van Oostenryck
2016-02-01  2:41 ` [PATCH v3 14/21] evaluate: recognize string literals " Nicolai Stange
2016-03-15 17:46   ` Luc Van Oostenryck
2016-02-01  2:42 ` [PATCH v3 15/21] expression: recognize references to labels " Nicolai Stange
2016-03-15 17:47   ` Luc Van Oostenryck
2016-02-01  2:42 ` [PATCH v3 16/21] expression: examine constness of __builtin_offsetof at evaluation only Nicolai Stange
2016-03-15 19:52   ` Luc Van Oostenryck
2016-02-01  2:43 ` [PATCH v3 17/21] symbol: flag builtins constant_p, safe_p and warning as constexprs Nicolai Stange
2016-03-15 19:45   ` Luc Van Oostenryck
2016-02-01  2:44 ` [PATCH v3 18/21] evaluate: relax some constant expression rules for pointer expressions Nicolai Stange
2016-03-15 17:47   ` Luc Van Oostenryck
2016-03-15 19:44     ` Luc Van Oostenryck
2016-03-15 18:10   ` Luc Van Oostenryck
2016-02-01  2:45 ` [PATCH v3 19/21] expression, evaluate: support compound literals as address constants Nicolai Stange
2016-03-15 20:02   ` Luc Van Oostenryck
2016-02-01  2:46 ` [PATCH v3 20/21] symbol: do not inherit storage modifiers from base types at examination Nicolai Stange
2016-03-15 20:31   ` Luc Van Oostenryck
2016-02-01  2:47 ` [PATCH v3 21/21] evaluation: treat comparsions between types as integer constexpr Nicolai Stange
2016-03-15 20:34   ` Luc Van Oostenryck
2016-02-19  8:22 ` [PATCH v3 00/21] improve constexpr handling Nicolai Stange
2016-02-24  9:45   ` Christopher Li
2016-02-24 12:13     ` Nicolai Stange
2016-03-15 16:54   ` Luc Van Oostenryck
2016-03-15 22:36 ` Luc Van Oostenryck
2016-10-28 20:28   ` Luc Van Oostenryck
2016-11-23  3:12 ` Christopher Li
2016-11-23  4:05   ` Luc Van Oostenryck
2016-11-23  6:49     ` Christopher Li
2016-11-23  8:39       ` Nicolai Stange
2016-11-23 15:36         ` Christopher Li
2016-11-23 16:43           ` Nicolai Stange
2016-11-23 17:38             ` Christopher Li
2016-11-23 18:23               ` Christopher Li
2016-11-23 18:33               ` Nicolai Stange [this message]
2016-11-24  1:18                 ` Christopher Li
2016-11-24  9:45                   ` Nicolai Stange
2016-11-24 11:24                     ` Christopher Li
2016-11-24 17:22                       ` Luc Van Oostenryck
2016-12-06  6:00                     ` Christopher Li
2016-12-06 16:54                       ` Luc Van Oostenryck
2017-03-29 14:42                       ` Luc Van Oostenryck
2017-03-31  5:06                         ` Christopher Li
2017-03-31  8:55                           ` Luc Van Oostenryck
2017-03-31 10:40                             ` Christopher Li
2017-03-31 19:47                               ` Luc Van Oostenryck

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=87lgwa59nm.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).