diff mbox

[committed] Fix OpenMP ICE with templates (PR c++/80141)

Message ID 20170322185542.GJ11094@tucnak
State New
Headers show

Commit Message

Jakub Jelinek March 22, 2017, 6:55 p.m. UTC
Hi!

As can be seen on the testcase, apparently it is a bad idea to call
maybe_constant_value when processing_template_decl, e.g. the 2 && 2
is at that point still 2 && 2 rather than true && true and constexpr
code is unhappy about that.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
committed to trunk so far.

2017-03-22  Jakub Jelinek  <jakub@redhat.com>

	PR c++/80141
	* semantics.c (finish_omp_clause) <case OMP_CLAUSE_SIMDLEN,
	case OMP_CLAUSE_ALIGNED>: Call maybe_constant_value only when not
	processing_template_decl.

	* g++.dg/gomp/pr80141.C: New test.


	Jakub
diff mbox

Patch

--- gcc/cp/semantics.c.jj	2017-02-27 15:19:14.000000000 +0100
+++ gcc/cp/semantics.c	2017-03-22 15:46:34.003442833 +0100
@@ -6416,9 +6416,9 @@  finish_omp_clauses (tree clauses, enum c
 	  else
 	    {
 	      t = mark_rvalue_use (t);
-	      t = maybe_constant_value (t);
 	      if (!processing_template_decl)
 		{
+		  t = maybe_constant_value (t);
 		  if (TREE_CODE (t) != INTEGER_CST
 		      || tree_int_cst_sgn (t) != 1)
 		    {
@@ -6586,9 +6586,9 @@  finish_omp_clauses (tree clauses, enum c
 	  else
 	    {
 	      t = mark_rvalue_use (t);
-	      t = maybe_constant_value (t);
 	      if (!processing_template_decl)
 		{
+		  t = maybe_constant_value (t);
 		  if (TREE_CODE (t) != INTEGER_CST
 		      || tree_int_cst_sgn (t) != 1)
 		    {
--- gcc/testsuite/g++.dg/gomp/pr80141.C.jj	2017-03-22 17:37:52.445284214 +0100
+++ gcc/testsuite/g++.dg/gomp/pr80141.C	2017-03-22 17:35:53.000000000 +0100
@@ -0,0 +1,8 @@ 
+// PR c++/80141
+// { dg-do compile }
+
+#pragma omp declare simd aligned (p : 2 && 2)
+template<int> void foo (int *p);
+
+#pragma omp declare simd simdlen (2 && 2)
+template<int> void bar (int *p);