public inbox for gdb-prs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <sourceware-bugzilla@sourceware.org>
To: gdb-prs@sourceware.org
Subject: [Bug gdb/30423] Build failures with clang 16
Date: Fri, 05 May 2023 19:27:27 +0000	[thread overview]
Message-ID: <bug-30423-4717-L0toO5g5Po@http.sourceware.org/bugzilla/> (raw)
In-Reply-To: <bug-30423-4717@http.sourceware.org/bugzilla/>

https://sourceware.org/bugzilla/show_bug.cgi?id=30423

--- Comment #2 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The gdb-13-branch branch has been updated by Simon Marchi
<simark@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=12e3f3bc6ec74eb50e04675f5bcf962482d3ff25

commit 12e3f3bc6ec74eb50e04675f5bcf962482d3ff25
Author: Simon Marchi <simon.marchi@efficios.com>
Date:   Thu Feb 23 12:35:40 2023 -0500

    gdbsupport: ignore -Wenum-constexpr-conversion in enum-flags.h

    When building with clang 16, we get:

          CXX    gdb.o
        In file included from /home/smarchi/src/binutils-gdb/gdb/gdb.c:19:
        In file included from /home/smarchi/src/binutils-gdb/gdb/defs.h:65:
        /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/enum-flags.h:95:52:
error: integer value -1 is outside the valid range of values [0, 15] for this
enumeration type [-Wenum-constexpr-conversion]
            integer_for_size<sizeof (T), static_cast<bool>(T (-1) < T
(0))>::type
                                                           ^

    The error message does not make it clear in the context of which enum
    flag this fails (i.e. what is T in this context), but it doesn't really
    matter, we have similar warning/errors for many of them, if we let the
    build go through.

    clang is right that the value -1 is invalid for the enum type we cast -1
    to.  However, we do need this expression in order to select an integer
    type with the appropriate signedness.  That is, with the same signedness
    as the underlying type of the enum.

    I first wondered if that was really needed, if we couldn't use
    std::underlying_type for that.  It turns out that the comment just above
    says:

        /* Note that std::underlying_type<enum_type> is not what we want here,
           since that returns unsigned int even when the enum decays to signed
           int.  */

    I was surprised, because std::is_signed<std::underlying_type<enum_type>>
    returns the right thing.  So I tried replacing all this with
    std::underlying_type, see if that would work.  Doing so causes some
    build failures in unittests/enum-flags-selftests.c:

          CXX    unittests/enum-flags-selftests.o
       
/home/smarchi/src/binutils-gdb/gdb/unittests/enum-flags-selftests.c:254:1:
error: static assertion failed due to requirement
'gdb::is_same<selftests::enum_flags_tests::check_valid_expr254::archetype<enum_flags<s
        elftests::enum_flags_tests::RE>, selftests::enum_flags_tests::RE,
enum_flags<selftests::enum_flags_tests::RE2>, selftests::enum_flags_tests::RE2,
enum_flags<selftests::enum_flags_tests::URE>, selftests::enum_fla
        gs_tests::URE, int>,
selftests::enum_flags_tests::check_valid_expr254::archetype<enum_flags<selftests::enum_flags_tests::RE>,
selftests::enum_flags_tests::RE, enum_flags<selftests::enum_flags_tests::RE2>,
selfte
        sts::enum_flags_tests::RE2,
enum_flags<selftests::enum_flags_tests::URE>, selftests::enum_flags_tests::URE,
unsigned int>>::value == true':
        CHECK_VALID (true,  int,  true ? EF () : EF2 ())
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
/home/smarchi/src/binutils-gdb/gdb/unittests/enum-flags-selftests.c:91:3: note:
expanded from macro 'CHECK_VALID'
          CHECK_VALID_EXPR_6 (EF, RE, EF2, RE2, UEF, URE, VALID, EXPR_TYPE,
EXPR)
         
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/valid-expr.h:105:3:
note: expanded from macro 'CHECK_VALID_EXPR_6'
          CHECK_VALID_EXPR_INT (ESC_PARENS (typename T1, typename T2,          
\
         
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/valid-expr.h:66:3:
note: expanded from macro 'CHECK_VALID_EXPR_INT'
          static_assert (gdb::is_detected_exact<archetype<TYPES, EXPR_TYPE>,   
\
          ^             
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    This is a bit hard to decode, but basically enumerations have the
    following funny property that they decay into a signed int, even if
    their implicit underlying type is unsigned.  This code:

        enum A {};
        enum B {};

        int main() {
          std::cout << std::is_signed<std::underlying_type<A>::type>::value
                    << std::endl;
          std::cout << std::is_signed<std::underlying_type<B>::type>::value
                    << std::endl;
          auto result = true ? A() : B();
          std::cout << std::is_signed<decltype(result)>::value << std::endl;
        }

    produces:

        0
        0
        1

    So, the "CHECK_VALID" above checks that this property works for enum flags
the
    same way as it would if you were using their underlying enum types.  And
    somehow, changing integer_for_size to use std::underlying_type breaks that.

    Since the current code does what we want, and I don't see any way of doing
it
    differently, ignore -Wenum-constexpr-conversion around it.

    (cherry picked from commit ae61525fcf456ab395d55c45492a106d1275873a)

    Change-Id: Ibc82ae7bbdb812102ae3f1dd099fc859dc6f3cc2
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30423
    Approved-By: Tom Tromey <tom@tromey.com>

-- 
You are receiving this mail because:
You are on the CC list for the bug.

  parent reply	other threads:[~2023-05-05 19:27 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-05 14:28 [Bug gdb/30423] New: " simon.marchi at polymtl dot ca
2023-05-05 15:05 ` [Bug gdb/30423] " tromey at sourceware dot org
2023-05-05 19:27 ` cvs-commit at gcc dot gnu.org [this message]
2023-05-05 19:27 ` cvs-commit at gcc dot gnu.org
2023-05-05 19:33 ` simon.marchi at polymtl dot ca

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-30423-4717-L0toO5g5Po@http.sourceware.org/bugzilla/ \
    --to=sourceware-bugzilla@sourceware.org \
    --cc=gdb-prs@sourceware.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).