From patchwork Fri Nov 19 10:06:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 47926 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 62F09385801D for ; Fri, 19 Nov 2021 10:07:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 62F09385801D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1637316423; bh=ZJqbqxgQh/thKmwphKTZvNX1A+J9VYnET5D7xFBO/ww=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=Wix+lKodkn+IZoR+nrEWNnh3huZ0CVpuBMWEgCwhTnQmzLi1hhXRbxyR3Xuw6nSum 51p6a0cW+NOWrqdJVDP7fEgAoXT84ef2JT2U5/4V8JFJ9YucrueD7VKI6EJBe1VNwp Y18YWg4ajMUJnubR6Yp2JVUWMduswQ5XTpW72q4M= 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 0EFC53858D3C for ; Fri, 19 Nov 2021 10:06:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0EFC53858D3C Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-550-l3pgfNj0MQegyTdyIC8fYA-1; Fri, 19 Nov 2021 05:06:30 -0500 X-MC-Unique: l3pgfNj0MQegyTdyIC8fYA-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F11C2100C662 for ; Fri, 19 Nov 2021 10:06:29 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.54]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8BEBD5E274; Fri, 19 Nov 2021 10:06:27 +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 1AJA6ODt4025751 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 19 Nov 2021 11:06:25 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 1AJA6ODl4025750; Fri, 19 Nov 2021 11:06:24 +0100 Date: Fri, 19 Nov 2021 11:06:24 +0100 To: Jason Merrill Subject: [PATCH] c++: Avoid adding implicit attributes during apply_late_template_attributes [PR101180] Message-ID: <20211119100624.GN2646553@tucnak> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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 Cc: gcc-patches@gcc.gnu.org Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi! decl_attributes and its caller cplus_decl_attributes sometimes add implicit attributes, e.g. optimize attribute if #pragma GCC optimize is active, target attribute if #pragma GCC target is active, or e.g. omp declare target attribute if in between #pragma omp declare target and #pragma omp end declare target. For templates that seems highly undesirable to me though, they should get those implicit attributes from the spot the templates were parsed (and they do get that), then tsubst through copy_node copies those attributes, but then apply_late_template_attributes can or does add a new set from the spot where they are instantiated, which can be pretty random point of first use of the template. Consider e.g. #pragma GCC push_options #pragma GCC target "avx" template inline void foo () { } #pragma GCC pop_options #pragma GCC push_options #pragma GCC target "crc32" void bar () { foo<0> (); } #pragma GCC pop_options testcase where the intention is that foo has avx target attribute and bar has crc32 target attribute, but we end up with __attribute__((target ("crc32"), target ("avx"))) on foo<0> (and due to yet another bug actually don't enable avx in foo<0>). In this particular case it is a regression caused by r12-299-ga0fdff3cf33f7284 which apparently calls cplus_decl_attributes even if attributes != NULL but late_attrs is NULL, before those changes we didn't call it in those cases. But, if there is at least one unrelated dependent attribute this would happen already in older releases. The following patch fixes that by temporarily overriding the variables that control the addition of the implicit attributes. Shall we also change the function so that it doesn't call cplus_decl_attributes if late_attrs is NULL, or was that change intentional? Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2021-11-19 Jakub Jelinek PR c++/101180 * pt.c (apply_late_template_attributes): Temporarily override current_optimize_pragma, optimization_current_node, current_target_pragma and scope_chain->omp_declare_target_attribute, so that cplus_decl_attributes doesn't add implicit attributes. * g++.target/i386/pr101180.C: New test. Jakub --- gcc/cp/pt.c.jj 2021-11-18 12:33:22.025628027 +0100 +++ gcc/cp/pt.c 2021-11-18 19:08:52.800539490 +0100 @@ -11722,6 +11722,17 @@ apply_late_template_attributes (tree *de q = &TREE_CHAIN (*q); } + /* cplus_decl_attributes can add some attributes implicitly. For templates, + those attributes should have been added already when those templates were + parsed, and shouldn't be added based on from which context they are + first time instantiated. */ + auto o1 = make_temp_override (current_optimize_pragma, NULL_TREE); + auto o2 = make_temp_override (optimization_current_node, + optimization_default_node); + auto o3 = make_temp_override (current_target_pragma, NULL_TREE); + auto o4 = make_temp_override (scope_chain->omp_declare_target_attribute, + NULL); + cplus_decl_attributes (decl_p, late_attrs, attr_flags); return true; --- gcc/testsuite/g++.target/i386/pr101180.C.jj 2021-11-18 19:11:50.512009888 +0100 +++ gcc/testsuite/g++.target/i386/pr101180.C 2021-11-18 19:11:33.066258216 +0100 @@ -0,0 +1,25 @@ +// PR c++/101180 +// { dg-do compile { target c++11 } } + +#pragma GCC target "avx" +template struct A {}; +#pragma GCC push_options +#pragma GCC target "avx,avx2,bmi,bmi2,fma,f16c" +template using B = A; +template struct C; +template <> struct C { + __attribute__((always_inline)) float operator()(long) { return .0f; } +}; +long d; +template void e(B) { + T{C()(d)}; +} +template void f(T d, FromT) { + e(d); +} +int g; +void h() { + A i; + f(i, g); +} +#pragma GCC pop_options