Bug 106675 - [10 Regression] g++ crashes on funky operators
Summary: [10 Regression] g++ crashes on funky operators
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 12.1.0
: P2 normal
Target Milestone: 10.5
Assignee: Marek Polacek
URL:
Keywords: ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2022-08-18 17:51 UTC by Isabella
Modified: 2023-02-15 00:09 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail: 12.1.0, 8.4.0, 8.5.0, 9.1.0
Last reconfirmed: 2022-08-18 00:00:00


Attachments
short repro (159 bytes, text/plain)
2022-08-18 17:51 UTC, Isabella
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Isabella 2022-08-18 17:51:22 UTC
Created attachment 53472 [details]
short repro

Attached is a small reproducer of something that originally came from boost::system::error_code.

g++ from v11 onward crashes on it: https://godbolt.org/z/nYqo1zj31
Comment 1 Andrew Pinski 2022-08-18 18:00:33 UTC
(In reply to Isabella from comment #0)
> g++ from v11 onward crashes on it: https://godbolt.org/z/nYqo1zj31

That is because the language default changed to gnu++17 from gnu++14.

Confirmed. It might be considered a regression even though it was rejected before GCC 8.4.0.

The ICE is in joust_maybe_elide_copy.
Comment 2 Andrew Pinski 2022-08-18 18:03:18 UTC
I suspect the patch for PR 86521 which was aiming on fixing the rejection was not fully correct and introduced an ICE in some cases ...
Comment 3 Martin Liška 2022-08-22 07:28:57 UTC
Likely started with r9-6526-gdcfa8518868d9eb8 with -std=c++17.
Comment 4 GCC Commits 2023-02-15 00:05:57 UTC
The trunk branch has been updated by Marek Polacek <mpolacek@gcc.gnu.org>:

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

commit r13-5990-gcce62625025380c2ea2a220deb10f8f355f83abf
Author: Marek Polacek <polacek@redhat.com>
Date:   Fri Feb 10 17:26:57 2023 -0500

    c++: fix ICE in joust_maybe_elide_copy [PR106675]
    
    joust_maybe_elide_copy checks that the last conversion in the ICS for
    the first argument is ck_ref_bind, which is reasonable, because we've
    checked that we're dealing with a copy/move constructor.  But it can
    also happen that we couldn't figure out which conversion function is
    better to convert the argument, as in this testcase: joust couldn't
    decide if we should go with
    
      operator foo &()
    
    or
    
      operator foo const &()
    
    so we get a ck_ambig, which then upsets joust_maybe_elide_copy.  Since
    a ck_ambig can validly occur, I think we should just return early, as
    in the patch below.
    
            PR c++/106675
    
    gcc/cp/ChangeLog:
    
            * call.cc (joust_maybe_elide_copy): Return false for ck_ambig.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/overload-conv-5.C: New test.
Comment 5 GCC Commits 2023-02-15 00:09:02 UTC
The releases/gcc-12 branch has been updated by Marek Polacek <mpolacek@gcc.gnu.org>:

https://gcc.gnu.org/g:1721d85708116a1edbe5ba30f055d47e6c1e29b6

commit r12-9174-g1721d85708116a1edbe5ba30f055d47e6c1e29b6
Author: Marek Polacek <polacek@redhat.com>
Date:   Fri Feb 10 17:26:57 2023 -0500

    c++: fix ICE in joust_maybe_elide_copy [PR106675]
    
    joust_maybe_elide_copy checks that the last conversion in the ICS for
    the first argument is ck_ref_bind, which is reasonable, because we've
    checked that we're dealing with a copy/move constructor.  But it can
    also happen that we couldn't figure out which conversion function is
    better to convert the argument, as in this testcase: joust couldn't
    decide if we should go with
    
      operator foo &()
    
    or
    
      operator foo const &()
    
    so we get a ck_ambig, which then upsets joust_maybe_elide_copy.  Since
    a ck_ambig can validly occur, I think we should just return early, as
    in the patch below.
    
            PR c++/106675
    
    gcc/cp/ChangeLog:
    
            * call.cc (joust_maybe_elide_copy): Return false for ck_ambig.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/overload-conv-5.C: New test.
    
    (cherry picked from commit cce62625025380c2ea2a220deb10f8f355f83abf)
Comment 6 GCC Commits 2023-02-15 00:09:39 UTC
The releases/gcc-11 branch has been updated by Marek Polacek <mpolacek@gcc.gnu.org>:

https://gcc.gnu.org/g:53512f0055186d5556e9859c1f8beb25d2d28530

commit r11-10525-g53512f0055186d5556e9859c1f8beb25d2d28530
Author: Marek Polacek <polacek@redhat.com>
Date:   Fri Feb 10 17:26:57 2023 -0500

    c++: fix ICE in joust_maybe_elide_copy [PR106675]
    
    joust_maybe_elide_copy checks that the last conversion in the ICS for
    the first argument is ck_ref_bind, which is reasonable, because we've
    checked that we're dealing with a copy/move constructor.  But it can
    also happen that we couldn't figure out which conversion function is
    better to convert the argument, as in this testcase: joust couldn't
    decide if we should go with
    
      operator foo &()
    
    or
    
      operator foo const &()
    
    so we get a ck_ambig, which then upsets joust_maybe_elide_copy.  Since
    a ck_ambig can validly occur, I think we should just return early, as
    in the patch below.
    
            PR c++/106675
    
    gcc/cp/ChangeLog:
    
            * call.c (joust_maybe_elide_copy): Return false for ck_ambig.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/overload-conv-5.C: New test.
    
    (cherry picked from commit cce62625025380c2ea2a220deb10f8f355f83abf)
Comment 7 Marek Polacek 2023-02-15 00:09:58 UTC
Fixed.