From patchwork Tue Nov 2 08:21:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 46945 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EFCA8385840D for ; Tue, 2 Nov 2021 08:22:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EFCA8385840D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1635841349; bh=0MRtrZ3mmY09j8LaySw3mNZ/UF/btCu5Y+WsBy5Ug4s=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=oVt9MbWD3Ud5dUDf0dyyi91z7w99SFVXqska90UvWu4/FgeKLJdQkfIrzDo+PB2nC yvLWsFSYgn5o9tqQdiqKZ/WfHSq8PPyd1ik8oTJSfOnexDt2AuZ64C7O/V9PHLsO/U isY2DIMWxevXnY7Ke4proxj+YrSrH0ggVuEH0HB8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id A21193858C60 for ; Tue, 2 Nov 2021 08:21:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A21193858C60 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-150-yB6fmiIaNgmAp5VAKQBAFg-1; Tue, 02 Nov 2021 04:21:57 -0400 X-MC-Unique: yB6fmiIaNgmAp5VAKQBAFg-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 76EFF80A5C1 for ; Tue, 2 Nov 2021 08:21:56 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.193.172]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 24D646091B for ; Tue, 2 Nov 2021 08:21:55 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.16.1/8.16.1) with ESMTPS id 1A28Lrq31019072 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT) for ; Tue, 2 Nov 2021 09:21:53 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 1A28LrCG1019071 for gcc-patches@gcc.gnu.org; Tue, 2 Nov 2021 09:21:53 +0100 Date: Tue, 2 Nov 2021 09:21:53 +0100 To: gcc-patches@gcc.gnu.org Subject: [committed] openmp: Add testcase for threadprivate random access class iterators Message-ID: <20211102082153.GA304296@tucnak> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-5.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jakub Jelinek via Gcc-patches From: Jakub Jelinek Reply-To: Jakub Jelinek Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi! This adds a testcase for random access class iterators. The diagnostics can be different between templates and non-templates, as for some threadprivate vars finish_id_expression replaces them with call to their corresponding wrapper, but I think it is not that big deal, we reject it in either case. Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk. 2021-11-02 Jakub Jelinek * g++.dg/gomp/loop-8.C: New test. Jakub --- gcc/testsuite/g++.dg/gomp/loop-8.C.jj 2021-11-01 13:28:47.520972858 +0100 +++ gcc/testsuite/g++.dg/gomp/loop-8.C 2021-11-01 13:23:29.676485591 +0100 @@ -0,0 +1,128 @@ +typedef __PTRDIFF_TYPE__ ptrdiff_t; + +template +class I +{ +public: + typedef ptrdiff_t difference_type; + I (); + ~I (); + I (T *); + I (const I &); + T &operator * (); + T *operator -> (); + T &operator [] (const difference_type &) const; + I &operator = (const I &); + I &operator ++ (); + I operator ++ (int); + I &operator -- (); + I operator -- (int); + I &operator += (const difference_type &); + I &operator -= (const difference_type &); + I operator + (const difference_type &) const; + I operator - (const difference_type &) const; + template friend bool operator == (I &, I &); + template friend bool operator == (const I &, const I &); + template friend bool operator < (I &, I &); + template friend bool operator < (const I &, const I &); + template friend bool operator <= (I &, I &); + template friend bool operator <= (const I &, const I &); + template friend bool operator > (I &, I &); + template friend bool operator > (const I &, const I &); + template friend bool operator >= (I &, I &); + template friend bool operator >= (const I &, const I &); + template friend typename I::difference_type operator - (I &, I &); + template friend typename I::difference_type operator - (const I &, const I &); + template friend I operator + (typename I::difference_type , const I &); +private: + T *p; +}; + +template bool operator == (I &, I &); +template bool operator == (const I &, const I &); +template bool operator != (I &, I &); +template bool operator != (const I &, const I &); +template bool operator < (I &, I &); +template bool operator < (const I &, const I &); +template bool operator <= (I &, I &); +template bool operator <= (const I &, const I &); +template bool operator > (I &, I &); +template bool operator > (const I &, const I &); +template bool operator >= (I &, I &); +template bool operator >= (const I &, const I &); +template typename I::difference_type operator - (I &, I &); +template typename I::difference_type operator - (const I &, const I &); +template I operator + (typename I::difference_type, const I &); + +extern I i, j; +#pragma omp threadprivate (i, j) +extern I k, l; +#pragma omp threadprivate (k, l) +I k, l; + +void +f1 (I &x, I &y) +{ + #pragma omp for collapse(2) + for (i = x; i < y; i++) // { dg-error "expected iteration declaration or initialization" } + for (j = x; j < y; j++) + ; +} + +void +f2 (I &x, I &y) +{ + #pragma omp for collapse(2) + for (k = x; k < y; k++) // { dg-error "expected iteration declaration or initialization" } + for (l = x; l < y; l++) + ; +} + +template +void +f3 (I &x, I &y) +{ + #pragma omp for collapse(2) + for (i = x; i < y; i++) // { dg-error "'i' is predetermined 'threadprivate' for 'private'" } + for (j = x; j < y; j++) // { dg-error "'j' is predetermined 'threadprivate' for 'private'" } + ; +} + +template +void +f4 (I &x, I &y) +{ + #pragma omp for collapse(2) + for (k = x; k < y; k++) // { dg-error "'k' is predetermined 'threadprivate' for 'private'" } + for (l = x; l < y; l++) // { dg-error "'l' is predetermined 'threadprivate' for 'private'" } + ; +} + +template +void +f5 (I &x, I &y) +{ + #pragma omp for collapse(2) // { dg-error "expected iteration declaration or initialization" } + for (i = x; i < y; i++) // { dg-error "'i' is predetermined 'threadprivate' for 'private'" } + for (j = x; j < y; j++) // { dg-error "'j' is predetermined 'threadprivate' for 'private'" } + ; +} + +template +void +f6 (I &x, I &y) +{ + #pragma omp for collapse(2) // { dg-error "expected iteration declaration or initialization" } + for (k = x; k < y; k++) // { dg-error "'k' is predetermined 'threadprivate' for 'private'" } + for (l = x; l < y; l++) // { dg-error "'l' is predetermined 'threadprivate' for 'private'" } + ; +} + +void +test (I &x, I &y) +{ + f3<0> (x, y); + f4<0> (x, y); + f5 (x, y); + f6 (x, y); +}