public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/omp/gcc-11] c++: Fix up attribute handling in methods in templates [PR100872]
@ 2021-06-04  9:26 Tobias Burnus
  0 siblings, 0 replies; only message in thread
From: Tobias Burnus @ 2021-06-04  9:26 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:83a2f78f334ec7c890415854f472f779baab4803

commit 83a2f78f334ec7c890415854f472f779baab4803
Author: Tobias Burnus <tobias@codesourcery.com>
Date:   Fri Jun 4 11:25:50 2021 +0200

    c++: Fix up attribute handling in methods in templates [PR100872]
    
    The following testcase FAILs because a dependent (late) attribute is never
    tsubsted.  While the testcase is OpenMP, I think it is a generic C++ FE problem
    that could affect any other dependent attribute.
    
    apply_late_template_attributes documents that it relies on
      /* save_template_attributes puts the dependent attributes at the beginning of
         the list; find the non-dependent ones.  */
    The "operator binding" attributes that are sometimes added are added to the
    head of DECL_ATTRIBUTES list though and because it doesn't have
    ATTR_IS_DEPENDENT set it violates this requirement.
    
    The following patch fixes it by adding that attribute after all
    ATTR_IS_DEPENDENT attributes.  I'm not 100% sure if DECL_ATTRIBUTES can't be
    shared by multiple functions (e.g. the cdtor clones), but the code uses
    later remove_attribute which could break that too.
    
    Other option would be to copy_list the ATTR_IS_DEPENDENT portion of the
    DECL_ATTRIBUTES list if we need to do this, that would be the same as this
    patch but replace that *ap = op_attr; at the end with
          *ap = NULL_TREE;
          DECL_ATTRIBUTES (cfn) = chainon (copy_list (DECL_ATTRIBUTES (cfn)),
                                           op_attr);
    Or perhaps set ATTR_IS_DEPENDENT on the "operator bindings" attribute,
    though it would need to be studied what would it try to do with the
    attribute during tsubst.
    
    2021-06-04  Jakub Jelinek  <jakub@redhat.com>
    
            PR c++/100872
            * name-lookup.c (maybe_save_operator_binding): Add op_attr after all
            ATTR_IS_DEPENDENT attributes in the DECL_ATTRIBUTES list rather than
            to the start.
    
            * g++.dg/gomp/declare-simd-8.C: New test.
    
    (cherry picked from commit 3011f1046628d5ce5e6e5f8e917a6aea1385fdc3)

Diff:
---
 gcc/cp/ChangeLog.omp                       | 10 ++++++++++
 gcc/cp/name-lookup.c                       |  7 +++++--
 gcc/testsuite/ChangeLog.omp                |  8 ++++++++
 gcc/testsuite/g++.dg/gomp/declare-simd-8.C | 15 +++++++++++++++
 4 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp
index d58fe1d926d..87f22832c30 100644
--- a/gcc/cp/ChangeLog.omp
+++ b/gcc/cp/ChangeLog.omp
@@ -1,3 +1,13 @@
+2021-06-04  Tobias Burnus  <tobias@codesourcery.com>
+
+	Backported from master:
+	2021-06-04  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/100872
+	* name-lookup.c (maybe_save_operator_binding): Add op_attr after all
+	ATTR_IS_DEPENDENT attributes in the DECL_ATTRIBUTES list rather than
+	to the start.
+
 2021-06-04  Tobias Burnus  <tobias@codesourcery.com>
 
 	Backported from master:
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 4e84e2f9987..d4387c09ef8 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -9137,9 +9137,12 @@ maybe_save_operator_binding (tree e)
   tree op_attr = lookup_attribute (op_bind_attrname, attributes);
   if (!op_attr)
     {
+      tree *ap = &DECL_ATTRIBUTES (cfn);
+      while (*ap && ATTR_IS_DEPENDENT (*ap))
+	ap = &TREE_CHAIN (*ap);
       op_attr = tree_cons (get_identifier (op_bind_attrname),
-			   NULL_TREE, attributes);
-      DECL_ATTRIBUTES (cfn) = op_attr;
+			   NULL_TREE, *ap);
+      *ap = op_attr;
     }
 
   tree op_bind = purpose_member (fnname, TREE_VALUE (op_attr));
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index 171848f7085..61023ef8dac 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,11 @@
+2021-06-04  Tobias Burnus  <tobias@codesourcery.com>
+
+	Backported from master:
+	2021-06-04  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/100872
+	* g++.dg/gomp/declare-simd-8.C: New test.
+
 2021-06-04  Tobias Burnus  <tobias@codesourcery.com>
 
 	Backported from master:
diff --git a/gcc/testsuite/g++.dg/gomp/declare-simd-8.C b/gcc/testsuite/g++.dg/gomp/declare-simd-8.C
new file mode 100644
index 00000000000..01c91e89091
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/declare-simd-8.C
@@ -0,0 +1,15 @@
+// PR c++/100872
+
+template <int N, typename T>
+struct S {
+  #pragma omp declare simd aligned(a : N * 2) aligned(b) linear(ref(b): N)
+  float foo (float *a, T *&b) { return *a + *b; }
+};
+
+S<16, float> s;
+
+float
+bar (float *a, float *p)
+{
+  return s.foo (a, p);
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-06-04  9:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-04  9:26 [gcc/devel/omp/gcc-11] c++: Fix up attribute handling in methods in templates [PR100872] Tobias Burnus

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).