This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gomp-3.1] const qualified vs. predetermination


Hi!

The final standard dropped const qualified vars without mutable member
back to being predetermined shared, but allows them to be specified in
firstprivate clause (so that valid OpenMP 3.0 using default(none)
aren't suddenly invalid).
The following patch implements that.  I'm not 100% sure about
const qualified static data members or const qualified threadprivate,
have asked about it on openmp forums, for the time being they aren't
allowed in firstprivate clause.

2011-07-11  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* c-typeck.c (c_finish_omp_clauses): Don't complain about
	const qualified predetermined vars in firstprivate clause.

	Revert
	2011-03-10  Jakub Jelinek  <jakub@redhat.com>

	* c-typeck.c (c_finish_omp_clauses): Complain about
	TREE_READONLY decls in private, lastprivate and reduction
	clauses.
gcc/c-family/
	Revert
	2011-03-10  Jakub Jelinek  <jakub@redhat.com>

	* c-omp.c (c_omp_predetermined_sharing): Don't return
	OMP_CLAUSE_DEFAULT_SHARED for TREE_READONLY decls.
gcc/cp/
	* semantics.c (finish_omp_clauses): Don't complain about
	const qualified predetermined vars in firstprivate clause,
	unless it is a static data member.

	Revert
	2011-03-10  Jakub Jelinek  <jakub@redhat.com>

	* cp-gimplify.c (cxx_omp_predetermined_sharing): Don't return
	OMP_CLAUSE_DEFAULT_SHARED for decls with TYPE_READONLY
	type having no mutable member.
	* semantics.c (finish_omp_clauses): Complain about
	TREE_READONLY decls with no mutable member in private,
	lastprivate and reduction clauses.
gcc/testsuite/
	* g++.dg/gomp/private-1.C: Adjust for expected wording of error
	messages.

	Revert
	2011-03-10  Jakub Jelinek  <jakub@redhat.com>

	* gcc.dg/gomp/appendix-a/a.24.1.c: Adjust for const-qualified
	decls having no mutable members no longer being predetermined
	shared.
	* gcc.dg/gomp/sharing-1.c: Likewise.
	* gcc.dg/gomp/clause-1.c: Likewise.
	* g++.dg/gomp/sharing-1.C: Likewise.
	* g++.dg/gomp/clause-3.C: Likewise.
	* g++.dg/gomp/predetermined-1.C: Likewise.

--- gcc/c-family/c-omp.c	(revision 176179)
+++ gcc/c-family/c-omp.c	(working copy)
@@ -601,7 +601,12 @@ c_split_parallel_clauses (location_t loc
 /* True if OpenMP sharing attribute of DECL is predetermined.  */
 
 enum omp_clause_default_kind
-c_omp_predetermined_sharing (tree decl ATTRIBUTE_UNUSED)
+c_omp_predetermined_sharing (tree decl)
 {
+  /* Variables with const-qualified type having no mutable member
+     are predetermined shared.  */
+  if (TREE_READONLY (decl))
+    return OMP_CLAUSE_DEFAULT_SHARED;
+
   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
 }
--- gcc/cp/cp-gimplify.c	(revision 176179)
+++ gcc/cp/cp-gimplify.c	(working copy)
@@ -1372,6 +1372,8 @@ cxx_omp_privatize_by_reference (const_tr
 enum omp_clause_default_kind
 cxx_omp_predetermined_sharing (tree decl)
 {
+  tree type;
+
   /* Static data members are predetermined as shared.  */
   if (TREE_STATIC (decl))
     {
@@ -1380,6 +1382,41 @@ cxx_omp_predetermined_sharing (tree decl
 	return OMP_CLAUSE_DEFAULT_SHARED;
     }
 
+  type = TREE_TYPE (decl);
+  if (TREE_CODE (type) == REFERENCE_TYPE)
+    {
+      if (!is_invisiref_parm (decl))
+	return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
+      type = TREE_TYPE (type);
+
+      if (TREE_CODE (decl) == RESULT_DECL && DECL_NAME (decl))
+	{
+	  /* NVR doesn't preserve const qualification of the
+	     variable's type.  */
+	  tree outer = outer_curly_brace_block (current_function_decl);
+	  tree var;
+
+	  if (outer)
+	    for (var = BLOCK_VARS (outer); var; var = DECL_CHAIN (var))
+	      if (DECL_NAME (decl) == DECL_NAME (var)
+		  && (TYPE_MAIN_VARIANT (type)
+		      == TYPE_MAIN_VARIANT (TREE_TYPE (var))))
+		{
+		  if (TYPE_READONLY (TREE_TYPE (var)))
+		    type = TREE_TYPE (var);
+		  break;
+		}
+	}
+    }
+
+  if (type == error_mark_node)
+    return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
+
+  /* Variables with const-qualified type having no mutable member
+     are predetermined shared.  */
+  if (TYPE_READONLY (type) && !cp_has_mutable_p (type))
+    return OMP_CLAUSE_DEFAULT_SHARED;
+
   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
 }
 
--- gcc/cp/semantics.c	(revision 176179)
+++ gcc/cp/semantics.c	(working copy)
@@ -3966,7 +3966,6 @@ finish_omp_clauses (tree clauses)
       bool need_copy_ctor = false;
       bool need_copy_assignment = false;
       bool need_implicitly_determined = false;
-      bool no_const = false;
       tree type, inner_type;
 
       switch (c_kind)
@@ -3980,7 +3979,6 @@ finish_omp_clauses (tree clauses)
 	  need_complete_non_reference = true;
 	  need_default_ctor = true;
 	  need_implicitly_determined = true;
-	  no_const = true;
 	  break;
 	case OMP_CLAUSE_FIRSTPRIVATE:
 	  name = "firstprivate";
@@ -3993,12 +3991,10 @@ finish_omp_clauses (tree clauses)
 	  need_complete_non_reference = true;
 	  need_copy_assignment = true;
 	  need_implicitly_determined = true;
-	  no_const = true;
 	  break;
 	case OMP_CLAUSE_REDUCTION:
 	  name = "reduction";
 	  need_implicitly_determined = true;
-	  no_const = true;
 	  break;
 	case OMP_CLAUSE_COPYPRIVATE:
 	  name = "copyprivate";
@@ -4089,6 +4085,13 @@ finish_omp_clauses (tree clauses)
 	    case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
 	      break;
 	    case OMP_CLAUSE_DEFAULT_SHARED:
+	      /* const vars may be specified in firstprivate clause,
+		 but don't allow static data members.  */
+	      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
+		  && (!TREE_STATIC (t)
+		      || !TYPE_P (CP_DECL_CONTEXT (t))
+		      || !MAYBE_CLASS_TYPE_P (CP_DECL_CONTEXT (t))))
+		break;
 	      share_name = "shared";
 	      break;
 	    case OMP_CLAUSE_DEFAULT_PRIVATE:
@@ -4103,23 +4106,6 @@ finish_omp_clauses (tree clauses)
 		     t, share_name, name);
 	      remove = true;
 	    }
-	  else if (no_const)
-	    {
-	      type = TREE_TYPE (t);
-	      if (type != error_mark_node
-		  && TYPE_READONLY (type)
-		  && (c_kind == OMP_CLAUSE_REDUCTION
-		      || !cp_has_mutable_p (type)))
-		{
-		  if (c_kind == OMP_CLAUSE_REDUCTION)
-		    error ("const-qualified %qE cannot appear in "
-			   "%<reduction%> clause", t);
-		  else
-		    error ("const-qualified %qE with no mutable member "
-			   "cannot appear in %qs clause", t, name);
-		  remove = true;
-		}
-	    }
 	}
 
       /* We're interested in the base element, not arrays.  */
--- gcc/c-typeck.c	(revision 176179)
+++ gcc/c-typeck.c	(working copy)
@@ -10417,7 +10417,6 @@ c_finish_omp_clauses (tree clauses)
       bool remove = false;
       bool need_complete = false;
       bool need_implicitly_determined = false;
-      bool no_const = false;
 
       switch (OMP_CLAUSE_CODE (c))
 	{
@@ -10430,13 +10429,11 @@ c_finish_omp_clauses (tree clauses)
 	  name = "private";
 	  need_complete = true;
 	  need_implicitly_determined = true;
-	  no_const = true;
 	  goto check_dup_generic;
 
 	case OMP_CLAUSE_REDUCTION:
 	  name = "reduction";
 	  need_implicitly_determined = true;
-	  no_const = true;
 	  t = OMP_CLAUSE_DECL (c);
 	  if (AGGREGATE_TYPE_P (TREE_TYPE (t))
 	      || POINTER_TYPE_P (TREE_TYPE (t)))
@@ -10548,7 +10545,6 @@ c_finish_omp_clauses (tree clauses)
 	  t = OMP_CLAUSE_DECL (c);
 	  need_complete = true;
 	  need_implicitly_determined = true;
-	  no_const = true;
 	  if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != PARM_DECL)
 	    {
 	      error_at (OMP_CLAUSE_LOCATION (c),
@@ -10605,6 +10601,10 @@ c_finish_omp_clauses (tree clauses)
 		case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
 		  break;
 		case OMP_CLAUSE_DEFAULT_SHARED:
+		  /* const vars may be specified in firstprivate clause.  */
+		  if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
+		      && TREE_READONLY (t))
+		    break;
 		  share_name = "shared";
 		  break;
 		case OMP_CLAUSE_DEFAULT_PRIVATE:
@@ -10620,13 +10620,6 @@ c_finish_omp_clauses (tree clauses)
 			    t, share_name, name);
 		  remove = true;
 		}
-	      else if (no_const && TREE_READONLY (t))
-		{
-		  error_at (OMP_CLAUSE_LOCATION (c),
-			    "const-qualified %qE cannot appear in %qs clause",
-			    t, name);
-		  remove = true;
-		}
 	    }
 	}
 
--- gcc/testsuite/gcc.dg/gomp/sharing-1.c	(revision 176179)
+++ gcc/testsuite/gcc.dg/gomp/sharing-1.c	(working copy)
@@ -44,7 +44,7 @@ main (void)
       thrglobalvar++;	/* Predetermined - threadprivate.  */
       thrlocvar++;	/* Predetermined - threadprivate.  */
       foo (i);		/* Predetermined - private (omp for loop variable).  */
-      foo (constvar);	/* { dg-error "not specified in" } */
+      foo (constvar);	/* Predetermined - shared (const qualified type).  */
       foo (*p);		/* *p predetermined - shared (heap allocated */
       (*p)++;		/* storage).  */
       bar (p);		/* Explicitly determined - private.  */
--- gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c	(revision 176179)
+++ gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c	(working copy)
@@ -17,7 +17,7 @@ a24 (int a)
     /* O.K.  -  a is listed in private clause */
     /*       -  z is listed in shared clause */
     x = c;			/* O.K.  -  x is threadprivate */
-    /* { dg-error "'c' not specified" "" { target *-*-* } 19 } */
+    				/*       -  c has const-qualified type */
     z[i] = y;
     /* { dg-error "'i' not specified" "" { target *-*-* } 21 } */
     /* { dg-error "enclosing parallel" "" { target *-*-* } 13 } */
--- gcc/testsuite/gcc.dg/gomp/clause-1.c	(revision 176179)
+++ gcc/testsuite/gcc.dg/gomp/clause-1.c	(working copy)
@@ -80,15 +80,15 @@ foo (int x)
     ;
 #pragma omp p reduction (*:t) /* { dg-error "predetermined 'threadprivate" } */
     ;
-#pragma omp p shared (c)
+#pragma omp p shared (c) /* { dg-error "predetermined 'shared'" } */
     ;
-#pragma omp p private (c) /* { dg-error "cannot appear in 'private'" } */
+#pragma omp p private (c) /* { dg-error "predetermined 'shared'" } */
     ;
 #pragma omp p firstprivate (c)
     ;
-#pragma omp p for lastprivate (c) /* { dg-error "cannot appear in 'lastprivate'" } */
+#pragma omp p for lastprivate (c) /* { dg-error "predetermined 'shared'" } */
   for (i = 0; i < 10; i++)
     ;
-#pragma omp p reduction (*:c) /* { dg-error "cannot appear in 'reduction'" } */
+#pragma omp p reduction (*:c) /* { dg-error "predetermined 'shared'" } */
     ;
 }
--- gcc/testsuite/g++.dg/gomp/clause-3.C	(revision 176179)
+++ gcc/testsuite/g++.dg/gomp/clause-3.C	(working copy)
@@ -80,15 +80,15 @@ foo (int x)
     ;
 #pragma omp p reduction (*:t) // { dg-error "predetermined 'threadprivate'" }
     ;
-#pragma omp p shared (c)
+#pragma omp p shared (c) // { dg-error "predetermined 'shared'" }
     ;
-#pragma omp p private (c) // { dg-error "cannot appear in 'private'" }
+#pragma omp p private (c) // { dg-error "predetermined 'shared'" }
     ;
 #pragma omp p firstprivate (c)
     ;
-#pragma omp p for lastprivate (c) // { dg-error "cannot appear in 'lastprivate'" }
+#pragma omp p for lastprivate (c) // { dg-error "predetermined 'shared'" }
   for (i = 0; i < 10; i++)
     ;
-#pragma omp p reduction (*:c) // { dg-error "cannot appear in 'reduction'" }
+#pragma omp p reduction (*:c) // { dg-error "predetermined 'shared'" }
     ;
 }
--- gcc/testsuite/g++.dg/gomp/predetermined-1.C	(revision 176179)
+++ gcc/testsuite/g++.dg/gomp/predetermined-1.C	(working copy)
@@ -15,18 +15,18 @@ const A foo (const A d, const C e)
   const A f;
   const B b = { 4 };
   A g;
-  #pragma omp parallel default (none)	// { dg-error "enclosing parallel" }
-    bar (&a);				// { dg-error "not specified" }
-  #pragma omp parallel default (none)	// { dg-error "enclosing parallel" }
-    bar (&b);				// { dg-error "not specified" }
+  #pragma omp parallel default (none)
+    bar (&a);
+  #pragma omp parallel default (none)
+    bar (&b);
   #pragma omp parallel default (none)	// { dg-error "enclosing parallel" }
     bar (&c);				// { dg-error "not specified" }
-  #pragma omp parallel default (none)	// { dg-error "enclosing parallel" }
-    bar (&d);				// { dg-error "not specified" }
+  #pragma omp parallel default (none)
+    bar (&d);
   #pragma omp parallel default (none)	// { dg-error "enclosing parallel" }
     bar (&e);				// { dg-error "not specified" }
-  #pragma omp parallel default (none)	// { dg-error "enclosing parallel" }
-    bar (&f);				// { dg-error "not specified" }
+  #pragma omp parallel default (none)
+    bar (&f);
   #pragma omp parallel default (none)	// { dg-error "enclosing parallel" }
     bar (&g);				// { dg-error "not specified" }
   return f;
--- gcc/testsuite/g++.dg/gomp/sharing-1.C	(revision 176179)
+++ gcc/testsuite/g++.dg/gomp/sharing-1.C	(working copy)
@@ -61,7 +61,7 @@ main (void)
       thrglobalvar++;	/* Predetermined - threadprivate.  */
       thrlocvar++;	/* Predetermined - threadprivate.  */
       foo (i);		/* Predetermined - private (omp for loop variable).  */
-      foo (constvar.x);	/* { dg-error "not specified in" } */
+      foo (constvar.x);	/* Predetermined - shared (const qualified type).  */
       foo (T::t.i);	/* Predetermined - shared (static data member).  */
       foo (*p);		/* *p predetermined - shared (heap allocated */
       (*p)++;		/* storage).  */
--- gcc/testsuite/g++.dg/gomp/private-1.C	(revision 176179)
+++ gcc/testsuite/g++.dg/gomp/private-1.C	(working copy)
@@ -15,17 +15,17 @@ const A foo (const A d, const C e)
   const A f;
   const B b = { 4 };
   A g;
-  #pragma omp parallel private (a)	// { dg-error "cannot appear in 'private'" }
+  #pragma omp parallel private (a)	// { dg-error "predetermined" }
     bar (&a);
-  #pragma omp parallel private (b)	// { dg-error "cannot appear in 'private'" }
+  #pragma omp parallel private (b)	// { dg-error "predetermined" }
     bar (&b);
   #pragma omp parallel private (c)
     bar (&c);
-  #pragma omp parallel private (d)	// { dg-error "cannot appear in 'private'" }
+  #pragma omp parallel private (d)	// { dg-error "predetermined" }
     bar (&d);
   #pragma omp parallel private (e)
     bar (&e);
-  #pragma omp parallel private (f)	// { dg-error "cannot appear in 'private'" }
+  #pragma omp parallel private (f)	// { dg-error "predetermined" }
     bar (&f);
   #pragma omp parallel private (g)
     bar (&g);

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]