public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer
@ 2024-07-20 15:37 pieter.p.dev at outlook dot com
  2024-07-20 17:42 ` [Bug c++/116015] " mpolacek at gcc dot gnu.org
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: pieter.p.dev at outlook dot com @ 2024-07-20 15:37 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 116015
           Summary: ICE in replace_placeholders_r for simple default
                    member initializer
           Product: gcc
           Version: 14.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pieter.p.dev at outlook dot com
  Target Milestone: ---

Created attachment 58713
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=58713&action=edit
Output from -freport-bug

G++ crashes when using member variables in the default initializer for another
member. Minimal example:

    struct MatrixLayout {
        int rows         = 0;
        int outer_stride = rows;
    };
    struct Matrix {
        Matrix(MatrixLayout) {}
    };
    struct Widget {
        int n = 5;
        Matrix A{{.rows = n}};
    };
    int main() {
        Widget w{};
    }

All versions of GCC between at least 5.1 and 14.1 seem to be affected:
  - 5.1: https://godbolt.org/z/1PKx8djxG
  - 14.1: https://godbolt.org/z/1eeEcYoqd
  - trunk: https://godbolt.org/z/7j7n38ohh
(8d6498f0d772775ad09d7d9e14f491a306e5f853)

Possibly related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100252#c5.

To the best of my knowledge, the source code is valid C++20 (and valid C++11
without the designated initializer), and Clang and MSVC compile the same code
without issues.

Output from GCC 14.1:

    ice.cpp: In function 'int main()':
    ice.cpp:16:14: internal compiler error: in replace_placeholders_r, at
cp/tree.cc:3414
       16 |     Widget w{};
          |              ^
    0x732cae replace_placeholders_r
        cp/tree.cc:3414
    0x11be9e3 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*,
void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
        tree.cc:11429
    0x11bef2f walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*,
void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
        tree.cc:11663
    0x960b0c replace_placeholders_r
        cp/tree.cc:3459
    0x11be9e3 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*,
void*), void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
        tree.cc:11429
    0x95d985 replace_placeholders(tree_node*, tree_node*, bool*)
        cp/tree.cc:3497
    0x7e0dde cp_gimplify_init_expr
        cp/cp-gimplify.cc:339
    0x7e0dde cp_gimplify_expr(tree_node**, gimple**, gimple**)
        cp/cp-gimplify.cc:652
    0xc139b8 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        gimplify.cc:17790
    0xc17616 gimplify_stmt(tree_node**, gimple**)
        gimplify.cc:7578
    0xc19632 gimplify_and_add(tree_node*, gimple**)
        gimplify.cc:515
    0xc19632 internal_get_tmp_var
        gimplify.cc:674
    0xc13c7b gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        gimplify.cc:18908
    0xc1b564 gimplify_expr
        gimplify.cc:18953
    0xc1b564 gimplify_arg(tree_node**, gimple**, unsigned int, bool)
        gimplify.cc:3779
    0xc1da17 gimplify_call_expr
        gimplify.cc:4064
    0xc15ac2 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        gimplify.cc:17853
    0xc17616 gimplify_stmt(tree_node**, gimple**)
        gimplify.cc:7578
    0xc15607 gimplify_cleanup_point_expr
        gimplify.cc:7316
    0xc15607 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        gimplify.cc:18277

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
@ 2024-07-20 17:42 ` mpolacek at gcc dot gnu.org
  2024-07-20 17:42 ` mpolacek at gcc dot gnu.org
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-07-20 17:42 UTC (permalink / raw)
  To: gcc-bugs

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

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
                 CC|                            |mpolacek at gcc dot gnu.org
             Status|UNCONFIRMED                 |NEW
           Keywords|                            |ice-on-valid-code
   Last reconfirmed|                            |2024-07-20

--- Comment #1 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Started with r5-4459-g3e605b20a0c804:

commit 3e605b20a0c804d57d4be0f4f2bbab8b4e42fce6
Author: Jason Merrill <jason@redhat.com>
Date:   Mon Oct 27 13:42:12 2014 -0400

    Implement N3653 (Member initializers and aggregates) and fix references to
'this' in constexpr constructors.

            Implement N3653 (Member initializers and aggregates) and fix
            references to 'this' in constexpr constructors.

also see r12-6028-ga37e8ce3b66325.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
  2024-07-20 17:42 ` [Bug c++/116015] " mpolacek at gcc dot gnu.org
@ 2024-07-20 17:42 ` mpolacek at gcc dot gnu.org
  2024-07-21 15:00 ` pieter.p.dev at outlook dot com
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-07-20 17:42 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
(Not a regression; previously we rejected the code.)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
  2024-07-20 17:42 ` [Bug c++/116015] " mpolacek at gcc dot gnu.org
  2024-07-20 17:42 ` mpolacek at gcc dot gnu.org
@ 2024-07-21 15:00 ` pieter.p.dev at outlook dot com
  2024-08-01 13:51 ` ppalka at gcc dot gnu.org
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pieter.p.dev at outlook dot com @ 2024-07-21 15:00 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Pieter P <pieter.p.dev at outlook dot com> ---
A temporary workaround is to wrap the default value in an immediately invoked
lambda:

    struct Widget {
        int n = 5;
        Matrix A = [this] { return Matrix{{.rows = n}}; }();
    };

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
                   ` (2 preceding siblings ...)
  2024-07-21 15:00 ` pieter.p.dev at outlook dot com
@ 2024-08-01 13:51 ` ppalka at gcc dot gnu.org
  2024-08-01 14:02 ` mpolacek at gcc dot gnu.org
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: ppalka at gcc dot gnu.org @ 2024-08-01 13:51 UTC (permalink / raw)
  To: gcc-bugs

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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ppalka at gcc dot gnu.org
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=100252

--- Comment #4 from Patrick Palka <ppalka at gcc dot gnu.org> ---
This does look very similar to PR100252#c5

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
                   ` (3 preceding siblings ...)
  2024-08-01 13:51 ` ppalka at gcc dot gnu.org
@ 2024-08-01 14:02 ` mpolacek at gcc dot gnu.org
  2024-08-06 18:54 ` mpolacek at gcc dot gnu.org
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-08-01 14:02 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Yeah.  (I would like to take a look soon but I'm not going to assign it to
myself until I have a patch/know what exactly is going on.)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
                   ` (4 preceding siblings ...)
  2024-08-01 14:02 ` mpolacek at gcc dot gnu.org
@ 2024-08-06 18:54 ` mpolacek at gcc dot gnu.org
  2024-08-06 19:04 ` mpolacek at gcc dot gnu.org
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-08-06 18:54 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
  Matrix A1{{n}};

ICEs too, but not

  Matrix A0{{}};
  Matrix A2{{n, n}};

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
                   ` (5 preceding siblings ...)
  2024-08-06 18:54 ` mpolacek at gcc dot gnu.org
@ 2024-08-06 19:04 ` mpolacek at gcc dot gnu.org
  2024-08-07 21:55 ` mpolacek at gcc dot gnu.org
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-08-06 19:04 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #7 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
As in bug 100252, we have:

D.2872 = {.rows=(&<PLACEHOLDER_EXPR struct Widget>)->n,
.outer_stride=(&<PLACEHOLDER_EXPR struct MatrixLayout>)->rows}

that is, two PLACEHOLDER_EXPRs for different types on the same level in one {
}.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
                   ` (6 preceding siblings ...)
  2024-08-06 19:04 ` mpolacek at gcc dot gnu.org
@ 2024-08-07 21:55 ` mpolacek at gcc dot gnu.org
  2024-08-14 19:36 ` cvs-commit at gcc dot gnu.org
  2024-08-14 19:37 ` mpolacek at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-08-07 21:55 UTC (permalink / raw)
  To: gcc-bugs

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

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |mpolacek at gcc dot gnu.org
             Status|NEW                         |ASSIGNED

--- Comment #8 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Testing a patch.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
                   ` (7 preceding siblings ...)
  2024-08-07 21:55 ` mpolacek at gcc dot gnu.org
@ 2024-08-14 19:36 ` cvs-commit at gcc dot gnu.org
  2024-08-14 19:37 ` mpolacek at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-08-14 19:36 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #9 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <mpolacek@gcc.gnu.org>:

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

commit r15-2920-gd91b6c93f98cac71f5588d73191d08ad788e600c
Author: Marek Polacek <polacek@redhat.com>
Date:   Fri Aug 9 16:14:18 2024 -0400

    c++: ICE with NSDMIs and fn arguments [PR116015]

    The problem in this PR is that we ended up with

      {.rows=(&<PLACEHOLDER_EXPR struct Widget>)->n,
       .outer_stride=(&<PLACEHOLDER_EXPR struct MatrixLayout>)->rows}

    that is, two PLACEHOLDER_EXPRs for different types on the same level
    in one { }.  That should not happen; we may, for instance, neglect to
    replace a PLACEHOLDER_EXPR due to CONSTRUCTOR_PLACEHOLDER_BOUNDARY on
    the constructor.

    The same problem happened in PR100252, which I fixed by introducing
    replace_placeholders_for_class_temp_r.  That didn't work here, though,
    because r_p_for_c_t_r only works for non-eliding TARGET_EXPRs: replacing
    a PLACEHOLDER_EXPR with a temporary that is going to be elided will
    result in a crash in gimplify_var_or_parm_decl when it encounters such
    a loose decl.

    But leaving the PLACEHOLDER_EXPRs in is also bad because then we end
    up with this PR.

    TARGET_EXPRs for function arguments are elided in gimplify_arg.  The
    argument will get a real temporary only in get_formal_tmp_var.  One
    idea was to use the temporary that is going to be elided anyway, and
    then replace_decl it with the real object once we get it.  But that
    didn't work out: one problem is that we elide the TARGET_EXPR for an
    argument before we create the real temporary for the argument, and
    when we get it, the context that this was a TARGET_EXPR for an argument
    has been lost.  We're also in the middle end territory now, even though
    this is a C++-specific problem.

    A solution is to simply stop eliding TARGET_EXPRs whose initializer is
    a CONSTRUCTOR.  Such copies can't be (at the moment) elided anyway.  But
    not eliding all TARGET_EXPRs would be a pessimization.

            PR c++/116015

    gcc/cp/ChangeLog:

            * call.cc (convert_for_arg_passing): Don't set_target_expr_eliding
            when the TARGET_EXPR initializer is a CONSTRUCTOR.

    gcc/ChangeLog:

            * gimplify.cc (gimplify_arg): Do not strip a TARGET_EXPR whose
            initializer is a CONSTRUCTOR.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1y/nsdmi-aggr23.C: New test.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/116015] ICE in replace_placeholders_r for simple default member initializer
  2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
                   ` (8 preceding siblings ...)
  2024-08-14 19:36 ` cvs-commit at gcc dot gnu.org
@ 2024-08-14 19:37 ` mpolacek at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-08-14 19:37 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #10 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Fixed on trunk so far.  I think it makes sense to fix this in 14 too.

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2024-08-14 19:37 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-07-20 15:37 [Bug c++/116015] New: ICE in replace_placeholders_r for simple default member initializer pieter.p.dev at outlook dot com
2024-07-20 17:42 ` [Bug c++/116015] " mpolacek at gcc dot gnu.org
2024-07-20 17:42 ` mpolacek at gcc dot gnu.org
2024-07-21 15:00 ` pieter.p.dev at outlook dot com
2024-08-01 13:51 ` ppalka at gcc dot gnu.org
2024-08-01 14:02 ` mpolacek at gcc dot gnu.org
2024-08-06 18:54 ` mpolacek at gcc dot gnu.org
2024-08-06 19:04 ` mpolacek at gcc dot gnu.org
2024-08-07 21:55 ` mpolacek at gcc dot gnu.org
2024-08-14 19:36 ` cvs-commit at gcc dot gnu.org
2024-08-14 19:37 ` mpolacek at gcc dot gnu.org

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).