[Bug c++/103912] ICE in a consteval function which returns a lambda which takes a "non-POD" argument and the consteval has other code

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue May 10 08:22:40 GMT 2022


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

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

https://gcc.gnu.org/g:9b80a9b0466f02e6e30790396c2b1545a9f8ff94

commit r10-10665-g9b80a9b0466f02e6e30790396c2b1545a9f8ff94
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Jan 10 20:49:11 2022 +0100

    c++: Ensure some more that immediate functions aren't gimplified [PR103912]

    Immediate functions should never be emitted into assembly, the FE doesn't
    genericize them and does various things to ensure they aren't gimplified.
    But the following testcase ICEs anyway due to that, because the consteval
    function returns a lambda, and operator() of the lambda has
    decl_function_context of the consteval function.  cgraphunit.c then
    does:
                  /* Preserve a functions function context node.  It will
                     later be needed to output debug info.  */
                  if (tree fn = decl_function_context (decl))
                    {
                      cgraph_node *origin_node = cgraph_node::get_create (fn);
                      enqueue_node (origin_node);
                    }
    which enqueues the immediate function and then tries to gimplify it,
    which results in ICE because it hasn't been genericized.

    When I try similar testcase with constexpr instead of consteval and
    static constinit auto instead of auto in main, what happens is that
    the functions are gimplified, later ipa.c discovers they aren't reachable
    and sets body_removed to true for them (and clears other flags) and we end
    up with a debug info which has the foo and bar functions without
    DW_AT_low_pc and other code specific attributes, just stuff from its BLOCK
    structure and in there the lambda with DW_AT_low_pc etc.

    The following patch attempts to emulate that behavior early, so that cgraph
    doesn't try to gimplify those and pretends they were already gimplified
    and found unused and optimized away.

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

            PR c++/103912
            * semantics.c (expand_or_defer_fn): For immediate functions, set
            node->body_removed to true and clear analyzed, definition and
            force_output.
            * decl2.c (c_parse_final_cleanups): Ignore immediate functions for
            expand_or_defer_fn.

            * g++.dg/cpp2a/consteval26.C: New test.

    (cherry picked from commit 54fa7daefe35cacf4a933947d1802318da193c01)


More information about the Gcc-bugs mailing list