public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "dmalcolm at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug analyzer/105092] ICE with local with NULL DECL_CONTEXT on templatized OpenMP iterator Date: Tue, 29 Mar 2022 13:56:03 +0000 [thread overview] Message-ID: <bug-105092-4-zTSHj4Kblz@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-105092-4@http.gcc.gnu.org/bugzilla/> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105092 David Malcolm <dmalcolm at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at redhat dot com, | |jason at redhat dot com Summary|ICE in |ICE with local with NULL |get_region_for_local, at |DECL_CONTEXT on templatized |analyzer/region.cc:874 |OpenMP iterator Status|NEW |WAITING --- Comment #2 from David Malcolm <dmalcolm at gcc dot gnu.org> --- The root cause of PR analyzer/104979 involved looking up a local variable in the wrong stack frame, so in r12-7790-g4cebae0924248beb I added assertions to the analyzer to ensure that when accessing a local variable in a frame, the frame is for the correct function. This new assertion is failing on the templatizing OpenMP reproducer in ana::frame_region::get_region_for_local: 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 } on this gimple stmt: i_11 = 0; The SSA name's underlying var_decl "i" has NULL for its DECL_CONTEXT, despite appearing to be a local variable. "i" is created here: (gdb) bt #0 copy_node (node=<var_decl 0x7fffea653d80 i>) at ../../src/gcc/tree.cc:1358 #1 0x0000000000bf64a3 in copy_decl (decl=<var_decl 0x7fffea653d80 i>) at ../../src/gcc/cp/lex.cc:1027 #2 0x0000000000d87d5c in tsubst_decl (t=<var_decl 0x7fffea653d80 i>, args=<tree_vec 0x7fffea7d2700>, complain=3) at ../../src/gcc/cp/pt.cc:14912 #3 0x0000000000d9462f in tsubst_omp_clause_decl (decl=<tree_list 0x7fffea7db280>, args=<tree_vec 0x7fffea7d2700>, complain=3, in_decl=<template_decl 0x7ffff7ffb480 __ct >, iterator_cache=0x7fffffffcc10) at ../../src/gcc/cp/pt.cc:17540 #4 0x0000000000d9509d in tsubst_omp_clauses (clauses=<omp_clause 0x7fffea7d3fc0>, ort=C_ORT_OMP, args=<tree_vec 0x7fffea7d2700>, complain=3, in_decl=<template_decl 0x7ffff7ffb480 __ct >) at ../../src/gcc/cp/pt.cc:17643 #5 0x0000000000d9eec5 in tsubst_expr (t=<omp_task 0x7fffea7db320>, args=<tree_vec 0x7fffea7d2700>, complain=3, in_decl=<template_decl 0x7ffff7ffb480 __ct >, integral_constant_expression_p=false) at ../../src/gcc/cp/pt.cc:18974 #6 0x0000000000d9d132 in tsubst_expr (t=<bind_expr 0x7fffea7d45a0>, args=<tree_vec 0x7fffea7d2700>, complain=3, in_decl=<template_decl 0x7ffff7ffb480 __ct >, integral_constant_expression_p=false) at ../../src/gcc/cp/pt.cc:18761 #7 0x0000000000d99d5c in tsubst_expr (t=<statement_list 0x7fffea7d2500>, args=<tree_vec 0x7fffea7d2700>, complain=3, in_decl=<template_decl 0x7ffff7ffb480 __ct >, integral_constant_expression_p=false) at ../../src/gcc/cp/pt.cc:18404 #8 0x0000000000d9d132 in tsubst_expr (t=<bind_expr 0x7fffea7d4570>, args=<tree_vec 0x7fffea7d2700>, complain=3, in_decl=<template_decl 0x7ffff7ffb480 __ct >, integral_constant_expression_p=false) at ../../src/gcc/cp/pt.cc:18761 #9 0x0000000000dc340d in instantiate_body (pattern=<template_decl 0x7ffff7ffb480 __ct >, args=<tree_vec 0x7fffea7d2700>, d=<function_decl 0x7fffea7c4f00 __ct >, nested_p=false) at ../../src/gcc/cp/pt.cc:26338 #10 0x0000000000dc4fcf in instantiate_decl (d=<function_decl 0x7fffea7c4f00 __ct >, defer_ok=false, expl_inst_class_mem_p=false) at ../../src/gcc/cp/pt.cc:26630 #11 0x0000000000dc53bb in instantiate_pending_templates (retries=0) at ../../src/gcc/cp/pt.cc:26709 #12 0x0000000000ba2148 in c_parse_final_cleanups () at ../../src/gcc/cp/decl2.cc:5092 #13 0x0000000000f31e7a in c_common_parse_file () at ../../src/gcc/c-family/c-opts.cc:1262 #14 0x00000000014ef80a in compile_file () at ../../src/gcc/toplev.cc:452 #15 0x0000000000a20e98 in do_compile (no_backend=false) at ../../src/gcc/toplev.cc:2168 #16 toplev::main (this=this@entry=0x7fffffffdcae, argc=<optimized out>, argc@entry=25, argv=<optimized out>, argv@entry=0x7fffffffddb8) at ../../src/gcc/toplev.cc:2320 #17 0x0000000000a22dd5 in main (argc=25, argv=0x7fffffffddb8) at ../../src/gcc/main.cc:39 as a copy of the "i" created here: (gdb) bt #0 make_node (code=VAR_DECL) at ../../src/gcc/tree.cc:1211 #1 0x00000000017e2d6e in build_decl (loc=292864, code=VAR_DECL, name=<identifier_node 0x7fffea7d3d80 i>, type=<integer_type 0x7fffea6655e8 int>) at ../../src/gcc/tree.cc:5289 #2 0x0000000000d0c3ce in cp_parser_omp_iterators (parser=0x7fffea6747b8) at ../../src/gcc/cp/parser.cc:39118 #3 0x0000000000d0c746 in cp_parser_omp_clause_affinity (parser=0x7fffea6747b8, list=<tree 0x0>) at ../../src/gcc/cp/parser.cc:39181 #4 0x0000000000d0f6b5 in cp_parser_omp_all_clauses (parser=0x7fffea6747b8, mask=..., where=0x259c622 "#pragma omp task", pragma_tok=0x7fffea5b41c8, finish_p=true, nested=0) at ../../src/gcc/cp/parser.cc:40274 #5 0x0000000000d1c848 in cp_parser_omp_task (parser=0x7fffea6747b8, pragma_tok=0x7fffea5b41c8, if_p=0x0) at ../../src/gcc/cp/parser.cc:43585 #6 0x0000000000d307ba in cp_parser_omp_construct (parser=0x7fffea6747b8, pragma_tok=0x7fffea5b41c8, if_p=0x0) at ../../src/gcc/cp/parser.cc:47225 #7 0x0000000000d31980 in cp_parser_pragma (parser=0x7fffea6747b8, context=pragma_compound, if_p=0x0) at ../../src/gcc/cp/parser.cc:47866 #8 0x0000000000cd0ee5 in cp_parser_statement (parser=0x7fffea6747b8, in_statement_expr=<tree 0x0>, in_compound=true, if_p=0x0, chain=0x0, loc_after_labels=0x0) at ../../src/gcc/cp/parser.cc:12393 #9 0x0000000000cd1f60 in cp_parser_statement_seq_opt (parser=0x7fffea6747b8, in_statement_expr=<tree 0x0>) at ../../src/gcc/cp/parser.cc:12846 #10 0x0000000000cd1e50 in cp_parser_compound_statement (parser=0x7fffea6747b8, in_statement_expr=<tree 0x0>, bcs_flags=0, function_body=true) at ../../src/gcc/cp/parser.cc:12798 #11 0x0000000000cebffb in cp_parser_function_body (parser=0x7fffea6747b8, in_function_try_block=false) at ../../src/gcc/cp/parser.cc:25056 #12 0x0000000000cec382 in cp_parser_ctor_initializer_opt_and_function_body (parser=0x7fffea6747b8, in_function_try_block=false) at ../../src/gcc/cp/parser.cc:25107 #13 0x0000000000cf95bb in cp_parser_function_definition_after_declarator (parser=0x7fffea6747b8, inline_p=true) at ../../src/gcc/cp/parser.cc:31237 #14 0x0000000000cfc4b6 in cp_parser_late_parsing_for_member (parser=0x7fffea6747b8, member_function=<function_decl 0x7fffea7c4d00 __ct >) at ../../src/gcc/cp/parser.cc:32159 #15 0x0000000000cef1f0 in cp_parser_class_specifier_1 (parser=0x7fffea6747b8) at ../../src/gcc/cp/parser.cc:26170 #16 0x0000000000cef2ec in cp_parser_class_specifier (parser=0x7fffea6747b8) at ../../src/gcc/cp/parser.cc:26198 #17 0x0000000000cdf767 in cp_parser_type_specifier (parser=0x7fffea6747b8, flags=33, decl_specs=0x7fffffffd820, is_declaration=true, declares_class_or_enum=0x7fffffffd77c, is_cv_qualifier=0x7fffffffd77b) at ../../src/gcc/cp/parser.cc:19342 #18 0x0000000000cd9513 in cp_parser_decl_specifier_seq (parser=0x7fffea6747b8, flags=33, decl_specs=0x7fffffffd820, declares_class_or_enum=0x7fffffffd8c4) at ../../src/gcc/cp/parser.cc:15901 #19 0x0000000000cfaa94 in cp_parser_single_declaration (parser=0x7fffea6747b8, checks=0x0, member_p=false, explicit_specialization_p=false, friend_p=0x7fffffffd917) at ../../src/gcc/cp/parser.cc:31642 #20 0x0000000000cf984a in cp_parser_template_declaration_after_parameters (parser=0x7fffea6747b8, parameter_list=<tree_vec 0x7fffea7d22a0>, member_p=false) at ../../src/gcc/cp/parser.cc:31305 #21 0x0000000000cfa909 in cp_parser_explicit_template_declaration (parser=0x7fffea6747b8, member_p=false) at ../../src/gcc/cp/parser.cc:31571 #22 0x0000000000cfa967 in cp_parser_template_declaration_after_export (parser=0x7fffea6747b8, member_p=false) at ../../src/gcc/cp/parser.cc:31590 #23 0x0000000000cdbff0 in cp_parser_template_declaration (parser=0x7fffea6747b8, member_p=false) at ../../src/gcc/cp/parser.cc:17452 #24 0x0000000000cd7323 in cp_parser_declaration (parser=0x7fffea6747b8, prefix_attrs=<tree 0x0>) at ../../src/gcc/cp/parser.cc:14893 #25 0x0000000000cd770d in cp_parser_toplevel_declaration (parser=0x7fffea6747b8) at ../../src/gcc/cp/parser.cc:14983 #26 0x0000000000cbf9fc in cp_parser_translation_unit (parser=0x7fffea6747b8) at ../../src/gcc/cp/parser.cc:5010 #27 0x0000000000d31f14 in c_parse_file () at ../../src/gcc/cp/parser.cc:48046 #28 0x0000000000f31d90 in c_common_parse_file () at ../../src/gcc/c-family/c-opts.cc:1240 #29 0x00000000014ef80a in compile_file () at ../../src/gcc/toplev.cc:452 #30 0x0000000000a20e98 in do_compile (no_backend=false) at ../../src/gcc/toplev.cc:2168 #31 toplev::main (this=this@entry=0x7fffffffdcae, argc=<optimized out>, argc@entry=25, argv=<optimized out>, argv@entry=0x7fffffffddb8) at ../../src/gcc/toplev.cc:2320 #32 0x0000000000a22dd5 in main (argc=25, argv=0x7fffffffddb8) at ../../src/gcc/main.cc:39 which has context: <function_decl 0x7fffea7c4d00 __ct > The copy of "i" initially has the same context after copy_decl in tsubst_decl here: Run till exit from #0 0x0000000000bf64a3 in copy_decl (decl=<var_decl 0x7fffea653d80 i>) at ../../src/gcc/cp/lex.cc:1027 tsubst_decl (t=<var_decl 0x7fffea653d80 i>, args=<tree_vec 0x7fffea7d2700>, complain=3) at ../../src/gcc/cp/pt.cc:14912 14912 r = copy_decl (t); but later in tsubst_decl it gets overwritten here: 14982 DECL_CONTEXT (r) = ctx; where "ctx" is NULL. ctx was set to NULL was set in tsubst_decl earlier here: 14865 if (!(VAR_P (t) && DECL_LOCAL_DECL_P (t))) 14866 /* Subsequent calls to pushdecl will fill this in. */ 14867 ctx = NULL_TREE; and ctxt remains NULL until the overwrite of DECL_CONTEXT (r). I'm not quite sure what the expected interaction between C++ template substitution and the OMP code here is. Is it expected that every local var_decl has a non-NULL DECL_CONTEXT? Alternatively, how should the analyzer determine which variables should be on the stack, and, of those, which function they relate to? Sorry if I'm missing something here.
next prev parent reply other threads:[~2022-03-29 13:56 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-03-29 6:42 [Bug analyzer/105092] New: ICE in get_region_for_local, at analyzer/region.cc:874 asolokha at gmx dot com 2022-03-29 8:51 ` [Bug analyzer/105092] " marxin at gcc dot gnu.org 2022-03-29 13:56 ` dmalcolm at gcc dot gnu.org [this message] 2022-03-29 15:06 ` [Bug c++/105092] ICE with local with NULL DECL_CONTEXT on templatized OpenMP iterator jakub at gcc dot gnu.org 2022-03-29 15:14 ` jakub at gcc dot gnu.org 2022-03-30 7:41 ` cvs-commit at gcc dot gnu.org 2022-03-30 8:18 ` jakub at gcc dot gnu.org
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-105092-4-zTSHj4Kblz@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).