On Wed, Sep 16, 2020 at 02:11:32PM -0400, Nathan Sidwell wrote: > Jakub, > are you ok with the bool return from cp_check_omp_declare_reduction? That > seemed like the least invasive change. > > This corrects the earlier problems with removing the template header > from local omp reductions. And it uncovered a latent bug. When we > tsubst such a decl, we immediately tsubst its body. > cp_check_omp_declare_reduction gets a success return value to gate > that instantiation. > > udr-2.C got a further error, as the omp checking machinery doesn't > appear to turn the reduction into an error mark when failing. I > didn't dig into that further. udr-3.C appears to have been invalid > and accidentally worked.
The attached patch doesn't match the ChangeLog... > gcc/cp/ > * cp-tree.h (cp_check_omp_declare_reduction): Return bool. > * semantics.c (cp_check_omp_declare_reduction): Return true on for > success. > * pt.c (push_template_decl_real): OMP reductions do not get a > template header. > (tsubst_function_decl): Remove special casing for local decl omp > reductions. > (tsubst_expr): Call instantiate_body for a local omp reduction. > (instantiate_body): Add nested_p parm, and deal with such > instantiations. > (instantiate_decl): Reject FUNCTION_SCOPE entities, adjust > instantiate_body call. > gcc/testsuite/ > * g++.dg/gomp/udr-2.C: Add additional expected error. > libgomp/ > * testsuite/libgomp.c++/udr-3.C: Add missing ctor. > > -- > Nathan Sidwell > diff --git i/gcc/c-family/c-opts.c w/gcc/c-family/c-opts.c > index 23934416f64..24e21ce0d0c 100644 > --- i/gcc/c-family/c-opts.c > +++ w/gcc/c-family/c-opts.c > @@ -1129,7 +1129,10 @@ c_common_post_options (const char **pfilename) > input_location = UNKNOWN_LOCATION; > > *pfilename = this_input_filename > - = cpp_read_main_file (parse_in, in_fnames[0], !cpp_opts->preprocessed); > + = cpp_read_main_file (parse_in, in_fnames[0], > + /* We'll inject preamble pieces if this is > + not preprocessed. */ > + !cpp_opts->preprocessed); > /* Don't do any compilation or preprocessing if there is no input file. */ > if (this_input_filename == NULL) > { > @@ -1453,6 +1456,7 @@ c_finish_options (void) > = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0, > _("<built-in>"), 0)); > cb_file_change (parse_in, bltin_map); > + linemap_line_start (line_table, 0, 1); > > /* Make sure all of the builtins about to be declared have > BUILTINS_LOCATION has their location_t. */ > @@ -1476,6 +1480,7 @@ c_finish_options (void) > = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0, > _("<command-line>"), 0)); > cb_file_change (parse_in, cmd_map); > + linemap_line_start (line_table, 0, 1); > > /* All command line defines must have the same location. */ > cpp_force_token_locations (parse_in, cmd_map->start_location); Jakub