From patchwork Thu Mar 10 17:30:45 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 86322 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id B3429B6FA5 for ; Fri, 11 Mar 2011 04:31:04 +1100 (EST) Received: (qmail 4667 invoked by alias); 10 Mar 2011 17:31:01 -0000 Received: (qmail 4572 invoked by uid 22791); 10 Mar 2011 17:30:58 -0000 X-SWARE-Spam-Status: No, hits=-6.4 required=5.0 tests=AWL, BAYES_00, FILL_THIS_FORM, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 10 Mar 2011 17:30:50 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p2AHUltc016051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Mar 2011 12:30:47 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p2AHUk49028449 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Mar 2011 12:30:46 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (localhost.localdomain [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id p2AHUj3h001411 for ; Thu, 10 Mar 2011 18:30:45 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id p2AHUjF7001409 for gcc-patches@gcc.gnu.org; Thu, 10 Mar 2011 18:30:45 +0100 Date: Thu, 10 Mar 2011 18:30:45 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [gomp3.1] In OpenMP 3.1 draft const-qualified decls having no mutable member are no longer predetermined shared Message-ID: <20110310173045.GT30899@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi! As %subj. said, const vars are no longer predetermined shared, they are just not allowed in private/lastprivate/reduction clauses. Tested on x86_64-linux, committed to gomp-3_1-branch. 2011-03-10 Jakub Jelinek * c-omp.c (c_omp_predetermined_sharing): Don't return OMP_CLAUSE_DEFAULT_SHARED for TREE_READONLY decls. * c-typeck.c (c_finish_omp_clauses): Complain about TREE_READONLY decls in private, lastprivate and reduction clauses. * 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.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. * g++.dg/gomp/private-1.C: New test. Jakub --- gcc/c-family/c-omp.c.jj 2011-03-03 19:59:40.000000000 +0100 +++ gcc/c-family/c-omp.c 2011-03-10 12:04:09.000000000 +0100 @@ -519,12 +519,7 @@ 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) +c_omp_predetermined_sharing (tree decl ATTRIBUTE_UNUSED) { - /* 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/c-typeck.c.jj 2011-03-03 20:00:38.000000000 +0100 +++ gcc/c-typeck.c 2011-03-10 12:04:09.000000000 +0100 @@ -10406,6 +10406,7 @@ 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)) { @@ -10418,11 +10419,13 @@ 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))) @@ -10534,6 +10537,7 @@ 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), @@ -10603,6 +10607,13 @@ 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/cp/cp-gimplify.c.jj 2011-02-24 14:18:07.000000000 +0100 +++ gcc/cp/cp-gimplify.c 2011-03-10 12:04:09.000000000 +0100 @@ -1184,8 +1184,6 @@ 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)) { @@ -1194,41 +1192,6 @@ 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.jj 2011-03-03 20:00:38.000000000 +0100 +++ gcc/cp/semantics.c 2011-03-10 12:04:09.000000000 +0100 @@ -3820,6 +3820,7 @@ 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) @@ -3833,6 +3834,7 @@ 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"; @@ -3845,10 +3847,12 @@ 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"; @@ -3952,6 +3956,23 @@ 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 " + "% 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/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c.jj 2011-02-24 14:13:38.000000000 +0100 +++ gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c 2011-03-10 12:58:21.000000000 +0100 @@ -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 */ - /* - c has const-qualified type */ + /* { dg-error "'c' not specified" "" { target *-*-* } 19 } */ z[i] = y; /* { dg-error "'i' not specified" "" { target *-*-* } 21 } */ /* { dg-error "enclosing parallel" "" { target *-*-* } 13 } */ --- gcc/testsuite/gcc.dg/gomp/sharing-1.c.jj 2011-02-24 14:13:38.000000000 +0100 +++ gcc/testsuite/gcc.dg/gomp/sharing-1.c 2011-03-10 13:10:21.000000000 +0100 @@ -44,7 +44,7 @@ main (void) thrglobalvar++; /* Predetermined - threadprivate. */ thrlocvar++; /* Predetermined - threadprivate. */ foo (i); /* Predetermined - private (omp for loop variable). */ - foo (constvar); /* Predetermined - shared (const qualified type). */ + foo (constvar); /* { dg-error "not specified in" } */ foo (*p); /* *p predetermined - shared (heap allocated */ (*p)++; /* storage). */ bar (p); /* Explicitly determined - private. */ --- gcc/testsuite/gcc.dg/gomp/clause-1.c.jj 2011-02-24 14:13:38.000000000 +0100 +++ gcc/testsuite/gcc.dg/gomp/clause-1.c 2011-03-10 13:08:34.000000000 +0100 @@ -80,15 +80,15 @@ foo (int x) ; #pragma omp p reduction (*:t) /* { dg-error "predetermined 'threadprivate" } */ ; -#pragma omp p shared (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p shared (c) ; -#pragma omp p private (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p private (c) /* { dg-error "cannot appear in 'private'" } */ ; -#pragma omp p firstprivate (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p firstprivate (c) ; -#pragma omp p for lastprivate (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p for lastprivate (c) /* { dg-error "cannot appear in 'lastprivate'" } */ for (i = 0; i < 10; i++) ; -#pragma omp p reduction (*:c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p reduction (*:c) /* { dg-error "cannot appear in 'reduction'" } */ ; } --- gcc/testsuite/g++.dg/gomp/private-1.C.jj 2011-03-10 13:42:08.000000000 +0100 +++ gcc/testsuite/g++.dg/gomp/private-1.C 2011-03-10 13:44:38.000000000 +0100 @@ -0,0 +1,33 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A { int i; A (); ~A (); }; +struct B { int i; }; +struct C { int i; mutable int j; C (); ~C (); }; + +template void bar (const T *); + +const A a; +const C c; + +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'" } + bar (&a); + #pragma omp parallel private (b) // { dg-error "cannot appear in 'private'" } + bar (&b); + #pragma omp parallel private (c) + bar (&c); + #pragma omp parallel private (d) // { dg-error "cannot appear in 'private'" } + bar (&d); + #pragma omp parallel private (e) + bar (&e); + #pragma omp parallel private (f) // { dg-error "cannot appear in 'private'" } + bar (&f); + #pragma omp parallel private (g) + bar (&g); + return f; +} --- gcc/testsuite/g++.dg/gomp/sharing-1.C.jj 2011-02-24 14:16:31.000000000 +0100 +++ gcc/testsuite/g++.dg/gomp/sharing-1.C 2011-03-10 13:10:50.000000000 +0100 @@ -61,7 +61,7 @@ main (void) thrglobalvar++; /* Predetermined - threadprivate. */ thrlocvar++; /* Predetermined - threadprivate. */ foo (i); /* Predetermined - private (omp for loop variable). */ - foo (constvar.x); /* Predetermined - shared (const qualified type). */ + foo (constvar.x); /* { dg-error "not specified in" } */ foo (T::t.i); /* Predetermined - shared (static data member). */ foo (*p); /* *p predetermined - shared (heap allocated */ (*p)++; /* storage). */ --- gcc/testsuite/g++.dg/gomp/clause-3.C.jj 2011-02-24 14:16:31.000000000 +0100 +++ gcc/testsuite/g++.dg/gomp/clause-3.C 2011-03-10 13:40:11.000000000 +0100 @@ -80,15 +80,15 @@ foo (int x) ; #pragma omp p reduction (*:t) // { dg-error "predetermined 'threadprivate'" } ; -#pragma omp p shared (c) // { dg-error "predetermined 'shared'" } +#pragma omp p shared (c) ; -#pragma omp p private (c) // { dg-error "predetermined 'shared'" } +#pragma omp p private (c) // { dg-error "cannot appear in 'private'" } ; -#pragma omp p firstprivate (c) // { dg-error "predetermined 'shared'" } +#pragma omp p firstprivate (c) ; -#pragma omp p for lastprivate (c) // { dg-error "predetermined 'shared'" } +#pragma omp p for lastprivate (c) // { dg-error "cannot appear in 'lastprivate'" } for (i = 0; i < 10; i++) ; -#pragma omp p reduction (*:c) // { dg-error "predetermined 'shared'" } +#pragma omp p reduction (*:c) // { dg-error "cannot appear in 'reduction'" } ; } --- gcc/testsuite/g++.dg/gomp/predetermined-1.C.jj 2011-02-24 14:16:31.000000000 +0100 +++ gcc/testsuite/g++.dg/gomp/predetermined-1.C 2011-03-10 13:41:35.000000000 +0100 @@ -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) - bar (&a); - #pragma omp parallel default (none) - bar (&b); + #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) // { dg-error "enclosing parallel" } bar (&c); // { dg-error "not specified" } - #pragma omp parallel default (none) - bar (&d); + #pragma omp parallel default (none) // { dg-error "enclosing parallel" } + bar (&d); // { dg-error "not specified" } #pragma omp parallel default (none) // { dg-error "enclosing parallel" } bar (&e); // { dg-error "not specified" } - #pragma omp parallel default (none) - bar (&f); + #pragma omp parallel default (none) // { dg-error "enclosing parallel" } + bar (&f); // { dg-error "not specified" } #pragma omp parallel default (none) // { dg-error "enclosing parallel" } bar (&g); // { dg-error "not specified" } return f;