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).