Commit 5c934396 by Jakub Jelinek

re PR c++/58706 (ICE with lambda in OpenMP for-loop)

	PR c++/58706
	* parser.c: Include tree-iterator.h.
	(cp_parser_omp_for_loop_init): Move lambda DECL_EXPRs from init
	to FOR_BLOCK.
	(cp_parser_omp_for_loop): Handle non-STATEMENT_LIST FOR_BLOCK
	entries.

	* testsuite/libgomp.c++/pr58706.C: New test.

From-SVN: r239251
parent 77524e0d
2016-08-08 Jakub Jelinek <jakub@redhat.com>
PR c++/58706
* parser.c: Include tree-iterator.h.
(cp_parser_omp_for_loop_init): Move lambda DECL_EXPRs from init
to FOR_BLOCK.
(cp_parser_omp_for_loop): Handle non-STATEMENT_LIST FOR_BLOCK
entries.
2016-08-06 Jonathan Wakely <jwakely@redhat.com> 2016-08-06 Jonathan Wakely <jwakely@redhat.com>
* call.c (convert_like_real): Harmonize diagnostics for invalid * call.c (convert_like_real): Harmonize diagnostics for invalid
reference binding. reference binding.
2016-08-05 Martin Sebor <msebor@redhat.com> 2016-08-05 Martin Sebor <msebor@redhat.com>
* constexpr.c (cxx_eval_store_expression): Remove hyphen from * constexpr.c (cxx_eval_store_expression): Remove hyphen from
the spelling of "constant-expression" in diagnostic messages the spelling of "constant-expression" in diagnostic messages
......
...@@ -41,6 +41,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -41,6 +41,7 @@ along with GCC; see the file COPYING3. If not see
#include "context.h" #include "context.h"
#include "cp-cilkplus.h" #include "cp-cilkplus.h"
#include "gcc-rich-location.h" #include "gcc-rich-location.h"
#include "tree-iterator.h"
/* The lexer. */ /* The lexer. */
...@@ -33495,7 +33496,33 @@ cp_parser_omp_for_loop_init (cp_parser *parser, ...@@ -33495,7 +33496,33 @@ cp_parser_omp_for_loop_init (cp_parser *parser,
init = NULL_TREE; init = NULL_TREE;
} }
else else
init = pop_stmt_list (this_pre_body); {
init = pop_stmt_list (this_pre_body);
if (init && TREE_CODE (init) == STATEMENT_LIST)
{
tree_stmt_iterator i = tsi_start (init);
/* Move lambda DECL_EXPRs to FOR_BLOCK. */
while (!tsi_end_p (i))
{
tree t = tsi_stmt (i);
if (TREE_CODE (t) == DECL_EXPR
&& TREE_CODE (DECL_EXPR_DECL (t)) == TYPE_DECL)
{
tsi_delink (&i);
vec_safe_push (for_block, t);
continue;
}
break;
}
if (tsi_one_before_end_p (i))
{
tree t = tsi_stmt (i);
tsi_delink (&i);
free_stmt_list (init);
init = t;
}
}
}
this_pre_body = NULL_TREE; this_pre_body = NULL_TREE;
} }
else else
...@@ -33899,7 +33926,13 @@ cp_parser_omp_for_loop (cp_parser *parser, enum tree_code code, tree clauses, ...@@ -33899,7 +33926,13 @@ cp_parser_omp_for_loop (cp_parser *parser, enum tree_code code, tree clauses,
} }
while (!for_block->is_empty ()) while (!for_block->is_empty ())
add_stmt (pop_stmt_list (for_block->pop ())); {
tree t = for_block->pop ();
if (TREE_CODE (t) == STATEMENT_LIST)
add_stmt (pop_stmt_list (t));
else
add_stmt (t);
}
release_tree_vector (for_block); release_tree_vector (for_block);
return ret; return ret;
2016-08-08 Jakub Jelinek <jakub@redhat.com>
PR c++/58706
* testsuite/libgomp.c++/pr58706.C: New test.
2016-08-04 Thomas Schwinge <thomas@codesourcery.com> 2016-08-04 Thomas Schwinge <thomas@codesourcery.com>
* testsuite/libgomp.oacc-c++/routine-1-auto.C: New file. * testsuite/libgomp.oacc-c++/routine-1-auto.C: New file.
......
// PR c++/58706
// { dg-do run }
// { dg-options "-std=c++11" }
template <typename T>
T
foo ()
{
T n = T ();
#pragma omp parallel for reduction (+: n)
for (T i = [](){ return 3; }(); i < 10; ++i)
n++;
return n;
}
template <typename T>
T
bar ()
{
T n = T ();
#pragma omp parallel for reduction (+: n)
for (T i = [](){ return 1; }() + [](){ return 4; }(); i < 10; ++i)
n++;
return n;
}
template <typename T>
T
baz ()
{
T n = T ();
#pragma omp parallel for reduction (+: n)
for (T i = T (); i < [](){ return 7; }() + [](){ return 11; }(); i += [](){ return 3; }() - [](){ return 1; }())
n++;
return n;
}
int
main ()
{
if (foo <int> () != 7 || foo <long long> () != 7)
__builtin_abort ();
if (bar <int> () != 5 || bar <char> () != 5)
__builtin_abort ();
if (baz <int> () != 9 || baz <long long> () != 9)
__builtin_abort ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment