= 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);
= 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)
--- /dev/null
+// 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} } }
--- /dev/null
+// 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} } }
--- /dev/null
+// 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} } }
--- /dev/null
+// 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} } }
--- /dev/null
+// 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} } }