aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/decl2.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-09-19 23:18:19 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-09-19 23:18:19 +0000
commit5bd916325a042777aa2fc925818c6f514979505f (patch)
tree577a94bc0d146df6b1608a58c7009c59ed67479d /gcc/cp/decl2.c
parent6775f1f3a749256c99544d13f7ea581edba6a585 (diff)
downloadgcc-5bd916325a042777aa2fc925818c6f514979505f.zip
gcc-5bd916325a042777aa2fc925818c6f514979505f.tar.gz
gcc-5bd916325a042777aa2fc925818c6f514979505f.tar.bz2
decl2.c (determine_visibility): Allow class visibility directives to override targetm.cxx.export_class_data.
* decl2.c (determine_visibility): Allow class visibility directives to override targetm.cxx.export_class_data. [[Split portion of a mixed commit.]] From-SVN: r87735.2
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r--gcc/cp/decl2.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 92233c7..c6b8f51 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1655,18 +1655,8 @@ determine_visibility (tree decl)
the visibility of their containing class. */
if (class_type)
{
- if (TREE_CODE (decl) == VAR_DECL
- && targetm.cxx.export_class_data ()
- && (DECL_TINFO_P (decl)
- || (DECL_VTABLE_OR_VTT_P (decl)
- /* Construction virtual tables are not emitted
- because they cannot be referred to from other
- object files; their name is not standardized by
- the ABI. */
- && !DECL_CONSTRUCTION_VTABLE_P (decl))))
- DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
- else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
- && lookup_attribute ("dllexport", TYPE_ATTRIBUTES (class_type)))
+ if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && lookup_attribute ("dllexport", TYPE_ATTRIBUTES (class_type)))
{
DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
DECL_VISIBILITY_SPECIFIED (decl) = 1;
@@ -1678,11 +1668,28 @@ determine_visibility (tree decl)
DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
DECL_VISIBILITY_SPECIFIED (decl) = 1;
}
+ else if (CLASSTYPE_VISIBILITY_SPECIFIED (class_type))
+ {
+ DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type);
+ DECL_VISIBILITY_SPECIFIED (decl) = 1;
+ }
+ /* If no explicit visibility information has been provided for
+ this class, some targets require that class data be
+ exported. */
+ else if (TREE_CODE (decl) == VAR_DECL
+ && targetm.cxx.export_class_data ()
+ && (DECL_TINFO_P (decl)
+ || (DECL_VTABLE_OR_VTT_P (decl)
+ /* Construction virtual tables are not emitted
+ because they cannot be referred to from other
+ object files; their name is not standardized by
+ the ABI. */
+ && !DECL_CONSTRUCTION_VTABLE_P (decl))))
+ DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
else
{
DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type);
- DECL_VISIBILITY_SPECIFIED (decl)
- = CLASSTYPE_VISIBILITY_SPECIFIED (class_type);
+ DECL_VISIBILITY_SPECIFIED (decl) = 0;
}
}
}