+2020-01-07 Jason Merrill <jason@redhat.com>
+
+ PR c++/47877 - -fvisibility-inlines-hidden and member templates.
+ * decl2.c (determine_visibility): -fvisibility-inlines-hidden beats
+ explicit class visibility for a template.
+
2020-01-07 Richard Sandiford <richard.sandiford@arm.com>
* mangle.c (mangle_type_attribute_p): New function, split out from...
tree attribs = (TREE_CODE (decl) == TYPE_DECL
? TYPE_ATTRIBUTES (TREE_TYPE (decl))
: DECL_ATTRIBUTES (decl));
+ tree attr = lookup_attribute ("visibility", attribs);
if (args != error_mark_node)
{
if (!DECL_VISIBILITY_SPECIFIED (decl))
{
- if (!DECL_VISIBILITY_SPECIFIED (pattern)
+ if (!attr
&& determine_hidden_inline (decl))
DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
else
if (args
/* Template argument visibility outweighs #pragma or namespace
visibility, but not an explicit attribute. */
- && !lookup_attribute ("visibility", attribs))
+ && !attr)
{
int depth = TMPL_ARGS_DEPTH (args);
if (DECL_VISIBILITY_SPECIFIED (decl))
--- /dev/null
+// PR c++/47877
+// { dg-options "-fvisibility-inlines-hidden" }
+// { dg-require-visibility "" }
+// { dg-final { scan-hidden "_ZN3Foo3barIS_EEvv" } }
+
+struct __attribute__((visibility("default"))) Foo {
+ template <class C> inline void bar() {};
+};
+
+int main()
+{
+ Foo().bar<Foo>();
+}
#define DECL_VISIBILITY(NODE) \
(DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility)
-/* Nonzero means that the decl had its visibility specified rather than
- being inferred. */
+/* Nonzero means that the decl (or an enclosing scope) had its
+ visibility specified rather than being inferred. */
#define DECL_VISIBILITY_SPECIFIED(NODE) \
(DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility_specified)