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

David Malcolm <dmalcolm at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2022-04-15
                 CC|                            |iains at gcc dot gnu.org
             Status|UNCONFIRMED                 |ASSIGNED

--- Comment #1 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Confirmed; it's an assertion failing in
ana::frame_region::get_region_for_local, due to a variable having NULL for its
DECL_CONTEXT:

(gdb) list
869             case SSA_NAME:
870               {
871                 if (tree var = SSA_NAME_VAR (expr))
872                   {
873                     if (DECL_P (var))
874                       gcc_assert (DECL_CONTEXT (var) == m_fun->decl);
875                   }

This is probably benign if assertions are disabled (perhaps the analyzer is
being more fussy than the rest of the middle-end?)

(gdb) call debug_tree(var)
 <var_decl 0x7fffea7c8750 D.2381
    type <boolean_type 0x7fffea665b28 bool sizes-gimplified public unsigned
type_6 QI
        size <integer_cst 0x7fffea667048 constant 8>
        unit-size <integer_cst 0x7fffea667060 constant 1>
        align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7fffea665b28 precision:1 min <integer_cst 0x7fffea6672a0 0> max <integer_cst
0x7fffea6672d0 1>
        pointer_to_this <pointer_type 0x7fffea7bddc8>>
    unsigned QI ../../src/gcc/testsuite/g++.dg/analyzer/pr105287.C:35:73 size
<integer_cst 0x7fffea667048 8> unit-size <integer_cst 0x7fffea667060 1>
    align:8 warn_if_not_align:0>
(gdb) p var.decl_minimal.context 
$2 = <tree 0x0>


The var_decl is "cond_var" created here in the C++ FE:

#4  0x0000000000b30ec2 in flatten_await_stmt (n=0x317b9b0,
promoted=0x7fffffffcc40, temps_used=0x7fffffffcc70, replace_in=<optimized out>)
    at ../../src/gcc/cp/coroutines.cc:2792
2792                  tree cond_var  = build_lang_decl (VAR_DECL, NULL_TREE,
cond_type);
(gdb) list
2787              /* If the condition contains an await expression, then we
need to
2788                 set that first and use a separate var.  */
2789              if (cp_walk_tree (&cond, find_any_await, &found, NULL))
2790                {
2791                  tree cond_type = TREE_TYPE (cond);
2792                  tree cond_var  = build_lang_decl (VAR_DECL, NULL_TREE,
cond_type);
2793                  DECL_ARTIFICIAL (cond_var) = true;
2794                  layout_decl (cond_var, 0);
2795                  gcc_checking_assert (!TYPE_NEEDS_CONSTRUCTING
(cond_type));
2796                  cond = build2 (INIT_EXPR, cond_type, cond_var, cond);
2797                  var_nest_node *ins
2798                    = new var_nest_node (cond_var, cond, n->prev, n);
2799                  COND_EXPR_COND (n->init) = cond_var;
2800                  flatten_await_stmt (ins, promoted, temps_used, NULL);
2801                }

Iain: shouldn't the DECL_CONTEXT be being set on var_decls created here?

Reply via email to