http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60331

            Bug ID: 60331
           Summary: ICE with OpenMP #pragma omp declare reduction in
                    template class
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code, openmp
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: reichelt at gcc dot gnu.org

The following valid(?) code snippet (compiled with "-std=c++11 -fopenmp")
triggers an ICE on trunk:

===============================================================================
template<typename> struct A
{
  #pragma omp declare reduction (x : int : omp_out += omp_in) initializer
(omp_priv = omp_priv)
};
===============================================================================

bug.cc: In static member function 'static void A< <template-parameter-1-1>
>::omp declare reduction x~i(int&)':
bug.cc:3:87: sorry, unimplemented: unexpected AST of kind decl_expr
   #pragma omp declare reduction (x : int : omp_out += omp_in) initializer
(omp_priv = omp_priv)
                                                                               
       ^
bug.cc:3:87: internal compiler error: in potential_constant_expression_1, at
cp/semantics.c:10553
0x746309 potential_constant_expression_1
        ../../gcc/gcc/cp/semantics.c:10553
0x6105a8 fold_non_dependent_expr_sfinae(tree_node*, int)
        ../../gcc/gcc/cp/pt.c:5111
0x610619 build_non_dependent_expr(tree_node*)
        ../../gcc/gcc/cp/pt.c:21306
0x72b0e0 finish_expr_stmt(tree_node*)
        ../../gcc/gcc/cp/semantics.c:688
0x6d2629 cp_parser_omp_declare_reduction_exprs
        ../../gcc/gcc/cp/parser.c:30638
0x6d404a cp_parser_late_parsing_for_member
        ../../gcc/gcc/cp/parser.c:23503
0x6ae0bc cp_parser_class_specifier_1
        ../../gcc/gcc/cp/parser.c:19451
0x6ae0bc cp_parser_class_specifier
        ../../gcc/gcc/cp/parser.c:19482
0x6ae0bc cp_parser_type_specifier
        ../../gcc/gcc/cp/parser.c:14305
0x6c6ec0 cp_parser_decl_specifier_seq
        ../../gcc/gcc/cp/parser.c:11547
0x6ccb63 cp_parser_single_declaration
        ../../gcc/gcc/cp/parser.c:23082
0x6cd044 cp_parser_template_declaration_after_export
        ../../gcc/gcc/cp/parser.c:22958
0x6d83e9 cp_parser_declaration
        ../../gcc/gcc/cp/parser.c:10947
0x6d6ed8 cp_parser_declaration_seq_opt
        ../../gcc/gcc/cp/parser.c:10869
0x6d877a cp_parser_translation_unit
        ../../gcc/gcc/cp/parser.c:4014
0x6d877a c_parse_file()
        ../../gcc/gcc/cp/parser.c:31582
0x7f79f3 c_common_parse_file()
        ../../gcc/gcc/c-family/c-opts.c:1060
Please submit a full bug report, [etc.]

Without "-std=c++11" or without the template, the code compiles fine.

Reply via email to