diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-11-23 16:54:39 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-11-23 16:54:39 +0100 |
commit | e2df23288c44590ba0ea99f03a7f16b5d113376e (patch) | |
tree | 5626b56e9d7cf58efbbf43c1fe8f990dbc77e0fb | |
parent | 756316926e5a112e15c800de34e4c2fc501d45be (diff) | |
download | gcc-e2df23288c44590ba0ea99f03a7f16b5d113376e.zip gcc-e2df23288c44590ba0ea99f03a7f16b5d113376e.tar.gz gcc-e2df23288c44590ba0ea99f03a7f16b5d113376e.tar.bz2 |
re PR c++/77739 (internal compiler error: in create_tmp_var, at gimple-expr.c:524)
PR c++/77739
* cp-gimplify.c (cp_gimplify_tree) <case VEC_INIT_EXPR>: Pass
false as handle_invisiref_parm_p to cp_genericize_tree.
(struct cp_genericize_data): Add handle_invisiref_parm_p field.
(cp_genericize_r): Don't wrap is_invisiref_parm into references
if !wtd->handle_invisiref_parm_p.
(cp_genericize_tree): Add handle_invisiref_parm_p argument,
set wtd.handle_invisiref_parm_p to it.
(cp_genericize): Pass true as handle_invisiref_parm_p to
cp_genericize_tree. Formatting fix.
* g++.dg/cpp1y/pr77739.C: New test.
From-SVN: r242766
-rw-r--r-- | gcc/cp/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr77739.C | 15 |
4 files changed, 42 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f5475ae..66ea957 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2016-11-23 Jakub Jelinek <jakub@redhat.com> + + PR c++/77739 + * cp-gimplify.c (cp_gimplify_tree) <case VEC_INIT_EXPR>: Pass + false as handle_invisiref_parm_p to cp_genericize_tree. + (struct cp_genericize_data): Add handle_invisiref_parm_p field. + (cp_genericize_r): Don't wrap is_invisiref_parm into references + if !wtd->handle_invisiref_parm_p. + (cp_genericize_tree): Add handle_invisiref_parm_p argument, + set wtd.handle_invisiref_parm_p to it. + (cp_genericize): Pass true as handle_invisiref_parm_p to + cp_genericize_tree. Formatting fix. + 2016-11-21 Bernd Edlinger <bernd.edlinger@hotmail.de> PR c++/71973 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 5b5c0be..0b8f9fc 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -38,7 +38,7 @@ along with GCC; see the file COPYING3. If not see static tree cp_genericize_r (tree *, int *, void *); static tree cp_fold_r (tree *, int *, void *); -static void cp_genericize_tree (tree*); +static void cp_genericize_tree (tree*, bool); static tree cp_fold (tree); /* Local declarations. */ @@ -623,7 +623,7 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) tf_warning_or_error); hash_set<tree> pset; cp_walk_tree (expr_p, cp_fold_r, &pset, NULL); - cp_genericize_tree (expr_p); + cp_genericize_tree (expr_p, false); ret = GS_OK; input_location = loc; } @@ -995,6 +995,7 @@ struct cp_genericize_data struct cp_genericize_omp_taskreg *omp_ctx; tree try_block; bool no_sanitize_p; + bool handle_invisiref_parm_p; }; /* Perform any pre-gimplification folding of C++ front end trees to @@ -1111,7 +1112,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) } /* Otherwise, do dereference invisible reference parms. */ - if (is_invisiref_parm (stmt)) + if (wtd->handle_invisiref_parm_p && is_invisiref_parm (stmt)) { *stmt_p = convert_from_reference (stmt); *walk_subtrees = 0; @@ -1511,7 +1512,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) /* Lower C++ front end trees to GENERIC in T_P. */ static void -cp_genericize_tree (tree* t_p) +cp_genericize_tree (tree* t_p, bool handle_invisiref_parm_p) { struct cp_genericize_data wtd; @@ -1520,6 +1521,7 @@ cp_genericize_tree (tree* t_p) wtd.omp_ctx = NULL; wtd.try_block = NULL_TREE; wtd.no_sanitize_p = false; + wtd.handle_invisiref_parm_p = handle_invisiref_parm_p; cp_walk_tree (t_p, cp_genericize_r, &wtd, NULL); delete wtd.p_set; wtd.bind_expr_stack.release (); @@ -1639,12 +1641,12 @@ cp_genericize (tree fndecl) /* Expand all the array notations here. */ if (flag_cilkplus && contains_array_notation_expr (DECL_SAVED_TREE (fndecl))) - DECL_SAVED_TREE (fndecl) = - expand_array_notation_exprs (DECL_SAVED_TREE (fndecl)); + DECL_SAVED_TREE (fndecl) + = expand_array_notation_exprs (DECL_SAVED_TREE (fndecl)); /* We do want to see every occurrence of the parms, so we can't just use walk_tree's hash functionality. */ - cp_genericize_tree (&DECL_SAVED_TREE (fndecl)); + cp_genericize_tree (&DECL_SAVED_TREE (fndecl), true); if (flag_sanitize & SANITIZE_RETURN && do_ubsan_in_current_function ()) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aeb8acc..ca673ee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-23 Jakub Jelinek <jakub@redhat.com> + + PR c++/77739 + * g++.dg/cpp1y/pr77739.C: New test. + 2016-11-23 Martin Jambor <mjambor@suse.cz> * c-c++-common/gomp/gridify-1.c: Update scan string. diff --git a/gcc/testsuite/g++.dg/cpp1y/pr77739.C b/gcc/testsuite/g++.dg/cpp1y/pr77739.C new file mode 100644 index 0000000..9618330 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr77739.C @@ -0,0 +1,15 @@ +// PR c++/77739 +// { dg-do compile { target c++14 } } + +struct A { + A(); + A(const A &); +}; +struct B { + B(); + template <typename... Args> auto g(Args &&... p1) { + return [=] { f(p1...); }; + } + void f(A, const char *); +}; +B::B() { g(A(), ""); } |