+2011-11-06 Jason Merrill <jason@redhat.com>
+
+ PR c++/35688
+ * c-common.c (decl_has_visibility_attr): Split out from...
+ (c_determine_visibility): ...here.
+ * c-common.h: Declare it.
+
2011-11-06 Joseph Myers <joseph@codesourcery.com>
* c-common.c (c_common_reswords): Add _Alignas and _Alignof.
return NULL_TREE;
}
+/* Returns true iff DECL actually has visibility specified by an attribute.
+ We check for an explicit attribute, rather than just checking
+ DECL_VISIBILITY_SPECIFIED, to distinguish the use of an attribute from
+ the use of a "#pragma GCC visibility push(...)"; in the latter case we
+ still want other considerations to be able to overrule the #pragma. */
+
+bool
+decl_has_visibility_attr (tree decl)
+{
+ tree attrs = DECL_ATTRIBUTES (decl);
+ return (lookup_attribute ("visibility", attrs)
+ || (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && (lookup_attribute ("dllimport", attrs)
+ || lookup_attribute ("dllexport", attrs))));
+}
+
/* Determine the ELF symbol visibility for DECL, which is either a
variable or a function. It is an error to use this function if a
definition of DECL is not available in this translation unit.
/* If the user explicitly specified the visibility with an
attribute, honor that. DECL_VISIBILITY will have been set during
- the processing of the attribute. We check for an explicit
- attribute, rather than just checking DECL_VISIBILITY_SPECIFIED,
- to distinguish the use of an attribute from the use of a "#pragma
- GCC visibility push(...)"; in the latter case we still want other
- considerations to be able to overrule the #pragma. */
- if (lookup_attribute ("visibility", DECL_ATTRIBUTES (decl))
- || (TARGET_DLLIMPORT_DECL_ATTRIBUTES
- && (lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl))
- || lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))))
+ the processing of the attribute. */
+ if (decl_has_visibility_attr (decl))
return true;
/* Set default visibility to whatever the user supplied with
extern void warn_logical_operator (location_t, enum tree_code, tree,
enum tree_code, tree, enum tree_code, tree);
extern void check_main_parameter_types (tree decl);
+extern bool decl_has_visibility_attr (tree);
extern bool c_determine_visibility (tree);
extern bool same_scalar_type_ignoring_signedness (tree, tree);
extern void mark_valid_location_for_stdc_pragma (bool);
DECL_NOT_REALLY_EXTERN (decl) = 1;
}
}
+ /* We check decl_has_visibility_attr rather than
+ DECL_VISIBILITY_SPECIFIED here because we want other considerations
+ to override visibility from a namespace or #pragma. */
else if (visibility > DECL_VISIBILITY (decl)
- && !DECL_VISIBILITY_SPECIFIED (decl))
+ && !decl_has_visibility_attr (decl))
{
DECL_VISIBILITY (decl) = (enum symbol_visibility) visibility;
return true;