diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b96f8121b32..9d053ab0325 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2011-01-13 Kai Tietz + + PR c++/47213 + * config/i386/cygming.h (TARGET_ASM_ASSEMBLE_VISIBILITY): + PE specific hook. + * config/i386/i386-protos.h (i386_pe_assemble_visibility): + New function prototype. + * config/i386/winnt.c (i386_pe_assemble_visibility): + Warn only if attribute was specified by user. + 2011-01-13 Michael Meissner PR target/47251 diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index be97d806132..9c32dda2e96 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -465,6 +465,9 @@ do { \ #define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION i386_pe_adjust_class_at_definition #define TARGET_MANGLE_DECL_ASSEMBLER_NAME i386_pe_mangle_decl_assembler_name +#undef TARGET_ASM_ASSEMBLE_VISIBILITY +#define TARGET_ASM_ASSEMBLE_VISIBILITY i386_pe_assemble_visibility + /* Static stack checking is supported by means of probes. */ #define STACK_CHECK_STATIC_BUILTIN 1 diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 1180e8ce4da..4f90b502167 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -225,6 +225,7 @@ extern void i386_pe_asm_output_aligned_decl_common (FILE *, tree, extern void i386_pe_file_end (void); extern void i386_pe_start_function (FILE *, const char *, tree); extern void i386_pe_end_function (FILE *, const char *, tree); +extern void i386_pe_assemble_visibility (tree, int); extern tree i386_pe_mangle_decl_assembler_name (tree, tree); extern tree i386_pe_mangle_assembler_name (const char *); diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c index c413bb0a3eb..169832fd36a 100644 --- a/gcc/config/i386/winnt.c +++ b/gcc/config/i386/winnt.c @@ -232,6 +232,22 @@ i386_pe_maybe_mangle_decl_assembler_name (tree decl, tree id) return new_id; } +/* Emit an assembler directive to set symbol for DECL visibility to + the visibility type VIS, which must not be VISIBILITY_DEFAULT. + As for PE there is no hidden support in gas, we just warn for + user-specified visibility attributes. */ + +void +i386_pe_assemble_visibility (tree decl, + int vis ATTRIBUTE_UNUSED) +{ + if (!decl + || !lookup_attribute ("visibility", DECL_ATTRIBUTES (decl))) + return; + warning (OPT_Wattributes, "visibility attribute not supported " + "in this configuration; ignored"); +} + /* This is used as a target hook to modify the DECL_ASSEMBLER_NAME in the language-independent default hook langhooks,c:lhd_set_decl_assembler_name () diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5088ba06f71..a57f9787165 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2011-01-13 Kai Tietz + + PR c++/47213 + * cp-tree.h (CLASSTYPE_VISIBILITY): Use + TYPE_MAIN_DECL instead of TYPE_NAME. + (CLASSTYPE_VISIBILITY_SPECIFIED): Likewise. + * decl2.c (determine_visibility): Add check + of CLASS_TYPE_P for underlying_type. + 2011-01-12 Rodrigo Rivas Costa * cp-tree.h (begin_for_scope): New prototype. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index dddbc01fb4a..3d39b5567c1 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1221,9 +1221,9 @@ enum languages { lang_c, lang_cplusplus, lang_java }; /* Gives the visibility specification for a class type. */ #define CLASSTYPE_VISIBILITY(TYPE) \ - DECL_VISIBILITY (TYPE_NAME (TYPE)) + DECL_VISIBILITY (TYPE_MAIN_DECL (TYPE)) #define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE) \ - DECL_VISIBILITY_SPECIFIED (TYPE_NAME (TYPE)) + DECL_VISIBILITY_SPECIFIED (TYPE_MAIN_DECL (TYPE)) typedef struct GTY (()) tree_pair_s { tree purpose; diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 0c64a5d4f0c..72570c3cbb6 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2073,7 +2073,8 @@ determine_visibility (tree decl) tree underlying_type = TREE_TYPE (DECL_NAME (decl)); int underlying_vis = type_visibility (underlying_type); if (underlying_vis == VISIBILITY_ANON - || CLASSTYPE_VISIBILITY_SPECIFIED (underlying_type)) + || (CLASS_TYPE_P (underlying_type) + && CLASSTYPE_VISIBILITY_SPECIFIED (underlying_type))) constrain_visibility (decl, underlying_vis); else DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b574148e9b9..8762f9ac31b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-13 Kai Tietz + + PR c++/47213 + * g++.dg/ext/pr47213.C: New. + 2011-01-13 Rainer Orth * gfortran.dg/cray_pointers_2.f90: Use dg-timeout-factor 4. diff --git a/gcc/testsuite/g++.dg/ext/pr47213.C b/gcc/testsuite/g++.dg/ext/pr47213.C new file mode 100644 index 00000000000..b39013c8f58 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr47213.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-fvisibility-ms-compat" } +#include + +template < typename T > void +bar () +{ + typeid (T); +} + +void +foo () +{ + bar < int () > (); +}