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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dmalcolm at gcc dot gnu.org,
                   |                            |jakub at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
For the __builtin_stack_save, the locus comes from the bind_expr or its block:
gimplify_bind_expr has:
  /* Source location wise, the cleanup code (stack_restore and clobbers)
     belongs to the end of the block, so propagate what we have.  The
     stack_save operation belongs to the beginning of block, which we can
     infer from the bind_expr directly if the block has no explicit
     assignment.  */
  if (BIND_EXPR_BLOCK (bind_expr))
    {
      end_locus = BLOCK_SOURCE_END_LOCATION (BIND_EXPR_BLOCK (bind_expr));
      start_locus = BLOCK_SOURCE_LOCATION (BIND_EXPR_BLOCK (bind_expr));
    }
  if (start_locus == 0)
    start_locus = EXPR_LOCATION (bind_expr);
Apparently, neither in C nor in C++ we have BLOCK_SOURCE_*LOCATION on the
BIND_EXPR_BLOCK of this bind_expr, so it comes from EXPR_LOCATION of the
bind_expr.
The C FE sets it from:
#0  0x0000000000bc42bb in c_build_bind_expr (loc=243168, block=<block
0x7fffea380480>, body=<statement_list 0x7fffea38c200>) at
../../gcc/c-family/c-gimplify.cc:661
#1  0x0000000000aed271 in c_end_compound_stmt (loc=243168, stmt=<statement_list
0x7fffea38c200>, do_scope=true) at ../../gcc/c/c-typeck.cc:11537
#2  0x0000000000b14a8c in c_parser_compound_statement (parser=0x7fffea24db40,
endlocp=0x7fffffffd38c) at ../../gcc/c/c-parser.cc:5613
where the used location is the location of the opening {
5599      brace_loc = c_parser_peek_token (parser)->location;
5600      if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
While C++ FE sets it in:
#0  0x0000000000f882a1 in c_build_bind_expr (loc=307648, block=<block
0x7fffea3ae5a0>, body=<statement_list 0x7fffea39f8e0>) at
../../gcc/c-family/c-gimplify.cc:661
#1  0x0000000000e7bcfd in do_poplevel (stmt_list=<statement_list
0x7fffea39f8e0>) at ../../gcc/cp/semantics.cc:639
#2  0x0000000000e7fdb0 in finish_compound_stmt (stmt=<statement_list
0x7fffea39f8e0>) at ../../gcc/cp/semantics.cc:1782
where do_poplevel uses input_location which is the "current" location, so the
end of the block and the location of the { is not available at that point.

Reply via email to