aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2023-12-15 10:03:31 -0500
committerPatrick Palka <ppalka@redhat.com>2023-12-15 10:03:31 -0500
commitea7bebff7cc5a5eb780a6ca646cb77cad1b625d6 (patch)
tree4b7cecb855de3516bd3c66df5f35523a599379be
parent46984fa259436ad50afb50a46a0a16e83bdf7172 (diff)
downloadgcc-ea7bebff7cc5a5eb780a6ca646cb77cad1b625d6.zip
gcc-ea7bebff7cc5a5eb780a6ca646cb77cad1b625d6.tar.gz
gcc-ea7bebff7cc5a5eb780a6ca646cb77cad1b625d6.tar.bz2
c++: section attribute on templates [PR70435, PR88061]
The section attribute currently has no effect on templates because the call to set_decl_section_name only happens at parse time (on the dependent decl) and not also at instantiation time. This patch fixes this by propagating the section name from the template to the instantiation. PR c++/70435 PR c++/88061 gcc/cp/ChangeLog: * pt.cc (tsubst_function_decl): Propagate DECL_SECTION_NAME via set_decl_section_name. (tsubst_decl) <case VAR_DECL>: Likewise. gcc/testsuite/ChangeLog: * g++.dg/ext/attr-section1.C: New test. * g++.dg/ext/attr-section1a.C: New test. * g++.dg/ext/attr-section2.C: New test. * g++.dg/ext/attr-section2a.C: New test. * g++.dg/ext/attr-section2b.C: New test.
-rw-r--r--gcc/cp/pt.cc4
-rw-r--r--gcc/testsuite/g++.dg/ext/attr-section1.C9
-rw-r--r--gcc/testsuite/g++.dg/ext/attr-section1a.C11
-rw-r--r--gcc/testsuite/g++.dg/ext/attr-section2.C9
-rw-r--r--gcc/testsuite/g++.dg/ext/attr-section2a.C14
-rw-r--r--gcc/testsuite/g++.dg/ext/attr-section2b.C12
6 files changed, 59 insertions, 0 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 50e6f06..a82d7ae 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -14607,6 +14607,8 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain,
= remove_attribute ("visibility", DECL_ATTRIBUTES (r));
}
determine_visibility (r);
+ if (DECL_SECTION_NAME (t))
+ set_decl_section_name (r, t);
if (DECL_DEFAULTED_OUTSIDE_CLASS_P (r)
&& !processing_template_decl)
defaulted_late_check (r);
@@ -15423,6 +15425,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain,
= remove_attribute ("visibility", DECL_ATTRIBUTES (r));
}
determine_visibility (r);
+ if ((!local_p || TREE_STATIC (t)) && DECL_SECTION_NAME (t))
+ set_decl_section_name (r, t);
}
if (!local_p)
diff --git a/gcc/testsuite/g++.dg/ext/attr-section1.C b/gcc/testsuite/g++.dg/ext/attr-section1.C
new file mode 100644
index 0000000..b8ac65b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attr-section1.C
@@ -0,0 +1,9 @@
+// PR c++/70435
+// { dg-do compile { target { c++11 && named_sections } } }
+
+template<class T>
+[[gnu::section(".foo")]] void fun() { }
+
+template void fun<int>();
+
+// { dg-final { scan-assembler {.section[ \t]+.foo} } }
diff --git a/gcc/testsuite/g++.dg/ext/attr-section1a.C b/gcc/testsuite/g++.dg/ext/attr-section1a.C
new file mode 100644
index 0000000..be24be2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attr-section1a.C
@@ -0,0 +1,11 @@
+// PR c++/70435
+// { dg-do compile { target { c++11 && named_sections } } }
+
+template<class T>
+struct A {
+ [[gnu::section(".foo")]] void fun() { }
+};
+
+template struct A<int>;
+
+// { dg-final { scan-assembler {.section[ \t]+.foo} } }
diff --git a/gcc/testsuite/g++.dg/ext/attr-section2.C b/gcc/testsuite/g++.dg/ext/attr-section2.C
new file mode 100644
index 0000000..a76f43b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attr-section2.C
@@ -0,0 +1,9 @@
+// PR c++/88061
+// { dg-do compile { target { c++14 && named_sections } } }
+
+template<class T>
+[[gnu::section(".foo")]] int var = 42;
+
+template int var<int>;
+
+// { dg-final { scan-assembler {.section[ \t]+.foo} } }
diff --git a/gcc/testsuite/g++.dg/ext/attr-section2a.C b/gcc/testsuite/g++.dg/ext/attr-section2a.C
new file mode 100644
index 0000000..a0b01cd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attr-section2a.C
@@ -0,0 +1,14 @@
+// PR c++/88061
+// { dg-do compile { target { c++11 && named_sections } } }
+
+template<class T>
+struct A {
+ [[gnu::section(".foo")]] static int var;
+};
+
+template<class T>
+int A<T>::var = 42;
+
+template struct A<int>;
+
+// { dg-final { scan-assembler {.section[ \t]+.foo} } }
diff --git a/gcc/testsuite/g++.dg/ext/attr-section2b.C b/gcc/testsuite/g++.dg/ext/attr-section2b.C
new file mode 100644
index 0000000..7b8313b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attr-section2b.C
@@ -0,0 +1,12 @@
+// PR c++/88061
+// { dg-do compile { target { c++11 && named_sections } } }
+
+template<class T>
+int* fun() {
+ [[gnu::section(".foo")]] static int var;
+ return &var;
+};
+
+template int* fun<int>();
+
+// { dg-final { scan-assembler {.section[ \t]+.foo} } }