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

            Bug ID: 120413
           Summary: C++ OpenMP 'target' SIGSEGV in
                    'gcc/cp/semantics.cc:finish_omp_target_clauses_r'
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code, openmp
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tschwinge at gcc dot gnu.org
                CC: burnus at gcc dot gnu.org, cltang at gcc dot gnu.org,
                    jakub at gcc dot gnu.org, waffl3x at gcc dot gnu.org
  Target Milestone: ---

Created attachment 61497
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61497&action=edit
'arr.C'

Via Waffl3x, the attached minimal C++ file SIGSEGVs with '-fopenmp' enabled (no
offloading configuration required):

    [...]/arr.C: In function ‘int main()’:
    [...]/arr.C:13:3: internal compiler error: Segmentation fault
       13 |   }
          |   ^

    Program received signal SIGSEGV, Segmentation fault.
    finish_omp_target_clauses_r (tp=<optimized out>,
walk_subtrees=0x7fffffffbebc, ptr=0x7fffffffc1f0) at
../../source-gcc/gcc/cp/semantics.cc:10569
    10569         for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN
(var))
    (gdb) print block
    $1 = (tree) 0x0
    (gdb) bt
    #0  finish_omp_target_clauses_r (tp=<optimized out>,
walk_subtrees=0x7fffffffbebc, ptr=0x7fffffffc1f0) at
../../source-gcc/gcc/cp/semantics.cc:10569
    #1  0x00000000017d94fe in walk_tree_1 (tp=0x7ffff78e06f0,
func=func@entry=0xba8400 <finish_omp_target_clauses_r(tree*, int*, void*)>,
data=data@entry=0x7fffffffc1f0, pset=pset@entry=0x7fffffffc080,
lh=lh@entry=0xbbd680 <cp_walk_subtrees(tree_node**, int*, tree_node*
(*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false,
default_hash_traits<tree_node*> >*)>) at ../../source-gcc/gcc/tree.cc:11588
    #2  0x00000000017d9be7 in walk_tree_1 (tp=<optimized out>,
tp@entry=0x7ffff78df340, func=func@entry=0xba8400
<finish_omp_target_clauses_r(tree*, int*, void*)>,
data=data@entry=0x7fffffffc1f0, pset=pset@entry=0x7fffffffc080,
lh=lh@entry=0xbbd680 <cp_walk_subtrees(tree_node**, int*, tree_node*
(*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false,
default_hash_traits<tree_node*> >*)>) at ../../source-gcc/gcc/tree.cc:11724
    #3  0x00000000017d9ab5 in walk_tree_1 (tp=0x7ffff78e2e38,
tp@entry=0x7ffff78df448, func=func@entry=0xba8400
<finish_omp_target_clauses_r(tree*, int*, void*)>,
data=data@entry=0x7fffffffc1f0, pset=pset@entry=0x7fffffffc080,
lh=lh@entry=0xbbd680 <cp_walk_subtrees(tree_node**, int*, tree_node*
(*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false,
default_hash_traits<tree_node*> >*)>) at ../../source-gcc/gcc/tree.cc:11704
    #4  0x00000000017d9ab5 in walk_tree_1 (tp=0x7ffff748d4f8,
tp@entry=0x7ffff78df538, func=func@entry=0xba8400
<finish_omp_target_clauses_r(tree*, int*, void*)>,
data=data@entry=0x7fffffffc1f0, pset=pset@entry=0x7fffffffc080,
lh=lh@entry=0xbbd680 <cp_walk_subtrees(tree_node**, int*, tree_node*
(*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false,
default_hash_traits<tree_node*> >*)>) at ../../source-gcc/gcc/tree.cc:11704
    #5  0x00000000017d9ab5 in walk_tree_1 (tp=0x7ffff748e050,
tp@entry=0x7fffffffc128, func=func@entry=0xba8400
<finish_omp_target_clauses_r(tree*, int*, void*)>,
data=data@entry=0x7fffffffc1f0, pset=pset@entry=0x7fffffffc080,
lh=lh@entry=0xbbd680 <cp_walk_subtrees(tree_node**, int*, tree_node*
(*)(tree_node**, int*, void*), void*, hash_set<tree_node*, false,
default_hash_traits<tree_node*> >*)>) at ../../source-gcc/gcc/tree.cc:11704
    #6  0x00000000017de396 in walk_tree_without_duplicates_1
(tp=tp@entry=0x7fffffffc128, func=func@entry=0xba8400
<finish_omp_target_clauses_r(tree*, int*, void*)>,
data=data@entry=0x7fffffffc1f0, lh=0xbbd680 <cp_walk_subtrees(tree_node**,
int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*,
false, default_hash_traits<tree_node*> >*)>) at
../../source-gcc/gcc/tree.cc:11848
    #7  0x0000000000ba1513 in finish_omp_target_clauses (loc=1184130,
body=body@entry=0x7ffff748e060, clauses_ptr=clauses_ptr@entry=0x7fffffffc338)
at ../../source-gcc/gcc/cp/semantics.cc:10620
    #8  0x0000000000ba4a22 in finish_omp_target (loc=1184130, clauses=0x0,
body=0x7ffff748e060, combined_p=combined_p@entry=false) at
../../source-gcc/gcc/cp/semantics.cc:10956
    #9  0x0000000000aa4a78 in cp_parser_omp_target
(parser=parser@entry=0x7ffff78c9d20,
pragma_tok=pragma_tok@entry=0x7ffff7689308,
context=context@entry=pragma_compound, if_p=if_p@entry=0x0) at
../../source-gcc/gcc/cp/parser.cc:48907
    [...]
    (gdb) list
    10564       }
    10565   
    10566     if (TREE_CODE (t) == BIND_EXPR)
    10567       {
    10568         tree block = BIND_EXPR_BLOCK (t);
    10569         for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN
(var))
    10570           if (!data->local_decls.contains (var))
    10571             data->local_decls.add (var);
    10572         return NULL_TREE;
    10573       }

I'm not familiar with this code to be able to easily tell if this just needs
skipping for '!block' or if something is wrong elsewhere.

That code was added in commit
r12-5835-g0ab29cf0bb68960c1f87405f14b4fb2109254e2f "openmp: Improve OpenMP
target support for C++ (PR92120)".

Reply via email to