public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/89074] valid pointer equality constexpr comparison rejected
Date: Fri, 14 Jan 2022 11:08:52 +0000	[thread overview]
Message-ID: <bug-89074-4-6WsGD0b43r@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-89074-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89074

--- Comment #16 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:d686d5d85c23451c03799dc55e456b73065f7333

commit r12-6578-gd686d5d85c23451c03799dc55e456b73065f7333
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Jan 14 12:07:49 2022 +0100

    c++: Reject in constant evaluation address comparisons of start of one var
and end of another [PR89074]

    The following testcase used to be incorrectly accepted.  The match.pd
    optimization that uses address_compare punts on folding comparison
    of start of one object and end of another one only when those addresses
    are cast to integral types, when the comparison is done on pointer types
    it assumes undefined behavior and decides to fold the comparison such
    that the addresses don't compare equal even when they at runtime they
    could be equal.
    But C++ says it is undefined behavior and so during constant evaluation
    we should reject those, so this patch adds !folding_initializer &&
    check to that spot.

    Note, address_compare has some special cases, e.g. it assumes that
    static vars are never adjacent to automatic vars, which is the case
    for the usual layout where automatic vars are on the stack and after
    .rodata/.data sections there is heap:
      /* Assume that automatic variables can't be adjacent to global
         variables.  */
      else if (is_global_var (base0) != is_global_var (base1))
        ;
    Is it ok that during constant evaluation we don't treat those as undefined
    behavior, or shall that be with !folding_initializer && too?

    Another special case is:
      if ((DECL_P (base0) && TREE_CODE (base1) == STRING_CST)
           || (TREE_CODE (base0) == STRING_CST && DECL_P (base1))
           || (TREE_CODE (base0) == STRING_CST
               && TREE_CODE (base1) == STRING_CST
               && ioff0 >= 0 && ioff1 >= 0
               && ioff0 < TREE_STRING_LENGTH (base0)
               && ioff1 < TREE_STRING_LENGTH (base1)
              /* This is a too conservative test that the STRING_CSTs
                 will not end up being string-merged.  */
               && strncmp (TREE_STRING_POINTER (base0) + ioff0,
                           TREE_STRING_POINTER (base1) + ioff1,
                           MIN (TREE_STRING_LENGTH (base0) - ioff0,
                                TREE_STRING_LENGTH (base1) - ioff1)) != 0))
        ;
      else if (!DECL_P (base0) || !DECL_P (base1))
        return 2;
    Here we similarly assume that vars aren't adjacent to string literals
    or vice versa.  Do we need to stick !folding_initializer && to those
    DECL_P vs. STRING_CST cases?  Though, because of the return 2; for
    non-DECL_P that would mean rejecting comparisons like &var == &"foobar"[3]
    etc. which ought to be fine, no?  So perhaps we need to watch for
    decls. vs. STRING_CSTs like for DECLs whether the address is at the start
    or at the end of the string literal or somewhere in between (at least
    for folding_initializer)?
    And yet another chapter but probably unsolvable is comparison of
    string literal addresses.  I think pedantically in C++
    &"foo"[0] == &"foo"[0] is undefined behavior, different occurences of
    the same string literals might still not be merged in some implementations.
    But constexpr const char *s = "foo"; &s[0] == &s[0] should be well defined,
    and we aren't tracking anywhere whether the string literal was the same one
    or different (and I think other compilers don't track that either).

    2022-01-14  Jakub Jelinek  <jakub@redhat.com>

            PR c++/89074
            * fold-const.c (address_compare): Punt on comparison of address of
            one object with address of end of another object if
            folding_initializer.

            * g++.dg/cpp1y/constexpr-89074-1.C: New test.

  parent reply	other threads:[~2022-01-14 11:08 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-89074-4@http.gcc.gnu.org/bugzilla/>
2021-07-27  9:30 ` pinskia at gcc dot gnu.org
2021-11-18 14:18 ` redi at gcc dot gnu.org
2021-11-18 16:14 ` cvs-commit at gcc dot gnu.org
2022-01-05 16:38 ` ppalka at gcc dot gnu.org
2022-01-05 16:56 ` jakub at gcc dot gnu.org
2022-01-05 17:07 ` ppalka at gcc dot gnu.org
2022-01-05 19:45 ` jakub at gcc dot gnu.org
2022-01-05 19:56 ` jakub at gcc dot gnu.org
2022-01-05 22:07 ` cvs-commit at gcc dot gnu.org
2022-01-05 22:07 ` cvs-commit at gcc dot gnu.org
2022-01-06 20:01 ` jakub at gcc dot gnu.org
2022-01-08  8:54 ` cvs-commit at gcc dot gnu.org
2022-01-14 11:08 ` cvs-commit at gcc dot gnu.org [this message]
2022-01-19  8:26 ` cvs-commit at gcc dot gnu.org
2022-02-06 10:21 ` cvs-commit at gcc dot gnu.org
2022-07-07 16:38 ` cvs-commit at gcc dot gnu.org
2022-11-07 14:16 ` ppalka at gcc dot gnu.org

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=bug-89074-4-6WsGD0b43r@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.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 read-only IMAP folder(s) and NNTP newsgroup(s).