diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-11-29 10:08:46 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-11-29 10:08:46 +0100 |
commit | b3f44388f3bb9b42553ea516984db4c4d4baa5bc (patch) | |
tree | dee1724a138a934e00ff1750d1c62706cdd1971a /gcc/cp | |
parent | efeeda757691b13e716c6681e7f6af5f85927e92 (diff) | |
download | gcc-b3f44388f3bb9b42553ea516984db4c4d4baa5bc.zip gcc-b3f44388f3bb9b42553ea516984db4c4d4baa5bc.tar.gz gcc-b3f44388f3bb9b42553ea516984db4c4d4baa5bc.tar.bz2 |
re PR c++/60228 (ICE using lambda in #pragma omp declare reduction)
PR c++/60228
* parser.c (cp_parser_omp_declare_reduction_exprs): If
processing_template_decl, wrap the combiner or initializer
into EXPR_STMT.
* decl.c (start_preparsed_function): Don't start a lambda scope
for DECL_OMP_DECLARE_REDUCTION_P functions.
(finish_function): Don't finish a lambda scope for
DECL_OMP_DECLARE_REDUCTION_P functions, nor cp_fold_function
them nor cp_genericize them.
* mangle.c (decl_mangling_context): Look through
DECL_OMP_DECLARE_REDUCTION_P functions.
* semantics.c (expand_or_defer_fn_1): For DECL_OMP_DECLARE_REDUCTION_P
functions, use tentative linkage, don't keep their bodies with
-fkeep-inline-functions and return false at the end.
* g++.dg/gomp/openmp-simd-2.C: Don't expect bodies for
DECL_OMP_DECLARE_REDUCTION_P functions.
* testsuite/libgomp.c++/udr-20.C: New test.
* testsuite/libgomp.c++/udr-21.C: New test.
From-SVN: r278831
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/cp/decl.c | 14 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 11 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 8 |
5 files changed, 48 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8b71f02..3a6bf05 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,20 @@ +2019-11-29 Jakub Jelinek <jakub@redhat.com> + + PR c++/60228 + * parser.c (cp_parser_omp_declare_reduction_exprs): If + processing_template_decl, wrap the combiner or initializer + into EXPR_STMT. + * decl.c (start_preparsed_function): Don't start a lambda scope + for DECL_OMP_DECLARE_REDUCTION_P functions. + (finish_function): Don't finish a lambda scope for + DECL_OMP_DECLARE_REDUCTION_P functions, nor cp_fold_function + them nor cp_genericize them. + * mangle.c (decl_mangling_context): Look through + DECL_OMP_DECLARE_REDUCTION_P functions. + * semantics.c (expand_or_defer_fn_1): For DECL_OMP_DECLARE_REDUCTION_P + functions, use tentative linkage, don't keep their bodies with + -fkeep-inline-functions and return false at the end. + 2019-11-28 Jakub Jelinek <jakub@redhat.com> PR c++/92695 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7d5bc91..81d7343 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -16318,7 +16318,8 @@ start_preparsed_function (tree decl1, tree attrs, int flags) && !implicit_default_ctor_p (decl1)) cp_ubsan_maybe_initialize_vtbl_ptrs (current_class_ptr); - start_lambda_scope (decl1); + if (!DECL_OMP_DECLARE_REDUCTION_P (decl1)) + start_lambda_scope (decl1); return true; } @@ -16703,7 +16704,8 @@ finish_function (bool inline_p) if (fndecl == NULL_TREE) return error_mark_node; - finish_lambda_scope (); + if (!DECL_OMP_DECLARE_REDUCTION_P (fndecl)) + finish_lambda_scope (); if (c_dialect_objc ()) objc_finish_function (); @@ -16845,7 +16847,9 @@ finish_function (bool inline_p) invoke_plugin_callbacks (PLUGIN_PRE_GENERICIZE, fndecl); /* Perform delayed folding before NRV transformation. */ - if (!processing_template_decl && !DECL_IMMEDIATE_FUNCTION_P (fndecl)) + if (!processing_template_decl + && !DECL_IMMEDIATE_FUNCTION_P (fndecl) + && !DECL_OMP_DECLARE_REDUCTION_P (fndecl)) cp_fold_function (fndecl); /* Set up the named return value optimization, if we can. Candidate @@ -16958,7 +16962,9 @@ finish_function (bool inline_p) do_warn_unused_parameter (fndecl); /* Genericize before inlining. */ - if (!processing_template_decl && !DECL_IMMEDIATE_FUNCTION_P (fndecl)) + if (!processing_template_decl + && !DECL_IMMEDIATE_FUNCTION_P (fndecl) + && !DECL_OMP_DECLARE_REDUCTION_P (fndecl)) cp_genericize (fndecl); cleanup: diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 0ac0451..88c5fa2 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -873,7 +873,16 @@ decl_mangling_context (tree decl) else if (template_type_parameter_p (decl)) /* template type parms have no mangling context. */ return NULL_TREE; - return CP_DECL_CONTEXT (decl); + + tcontext = CP_DECL_CONTEXT (decl); + + /* Ignore the artificial declare reduction functions. */ + if (tcontext + && TREE_CODE (tcontext) == FUNCTION_DECL + && DECL_OMP_DECLARE_REDUCTION_P (tcontext)) + return decl_mangling_context (tcontext); + + return tcontext; } /* <name> ::= <unscoped-name> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ed24416..fb03002 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -41244,6 +41244,8 @@ cp_parser_omp_declare_reduction_exprs (tree fndecl, cp_parser *parser) combiner = cp_parser_expression (parser); finish_expr_stmt (combiner); block = finish_omp_structured_block (block); + if (processing_template_decl) + block = build_stmt (input_location, EXPR_STMT, block); add_stmt (block); if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN)) @@ -41348,6 +41350,8 @@ cp_parser_omp_declare_reduction_exprs (tree fndecl, cp_parser *parser) block = finish_omp_structured_block (block); cp_walk_tree (&block, cp_remove_omp_priv_cleanup_stmt, omp_priv, NULL); + if (processing_template_decl) + block = build_stmt (input_location, EXPR_STMT, block); add_stmt (block); if (ctor) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 4a5479c..17de39e 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -4417,7 +4417,9 @@ expand_or_defer_fn_1 (tree fn) if (DECL_INTERFACE_KNOWN (fn)) /* We've already made a decision as to how this function will be handled. */; - else if (!at_eof || DECL_IMMEDIATE_FUNCTION_P (fn)) + else if (!at_eof + || DECL_IMMEDIATE_FUNCTION_P (fn) + || DECL_OMP_DECLARE_REDUCTION_P (fn)) tentative_decl_linkage (fn); else import_export_decl (fn); @@ -4429,6 +4431,7 @@ expand_or_defer_fn_1 (tree fn) if (DECL_DECLARED_INLINE_P (fn) && !DECL_REALLY_EXTERN (fn) && !DECL_IMMEDIATE_FUNCTION_P (fn) + && !DECL_OMP_DECLARE_REDUCTION_P (fn) && (flag_keep_inline_functions || (flag_keep_inline_dllexport && lookup_attribute ("dllexport", DECL_ATTRIBUTES (fn))))) @@ -4461,6 +4464,9 @@ expand_or_defer_fn_1 (tree fn) return false; } + if (DECL_OMP_DECLARE_REDUCTION_P (fn)) + return false; + return true; } |