aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2011-01-13 20:01:57 +0000
committerKai Tietz <ktietz@gcc.gnu.org>2011-01-13 21:01:57 +0100
commita2b63a20016d041e501d6c6541d059befbb244b9 (patch)
tree278e301a60748bc6875711d5bc89ab30014083bf /gcc
parent3752f75a6d54bf6a19a29da309f5433f8889f69f (diff)
downloadgcc-a2b63a20016d041e501d6c6541d059befbb244b9.zip
gcc-a2b63a20016d041e501d6c6541d059befbb244b9.tar.gz
gcc-a2b63a20016d041e501d6c6541d059befbb244b9.tar.bz2
re PR c++/47213 (ICE: SIGSEGV in determine_visibility (decl2.c:2076) with -fvisibility-ms-compat)
2011-01-13 Kai Tietz <kai.tietz@onevision.com> PR c++/47213 * g++.dg/ext/pr47213.C: New. 2011-01-13 Kai Tietz <kai.tietz@onevision.com> 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-13 Kai Tietz <kai.tietz@onevision.com> 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. From-SVN: r168763
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/cygming.h3
-rw-r--r--gcc/config/i386/i386-protos.h1
-rw-r--r--gcc/config/i386/winnt.c16
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/cp-tree.h4
-rw-r--r--gcc/cp/decl2.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/pr47213.C15
9 files changed, 63 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b96f812..9d053ab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2011-01-13 Kai Tietz <kai.tietz@onevision.com>
+
+ 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 <meissner@linux.vnet.ibm.com>
PR target/47251
diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index be97d80..9c32dda 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 1180e8c..4f90b50 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 c413bb0..169832f 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 5088ba0..a57f978 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2011-01-13 Kai Tietz <kai.tietz@onevision.com>
+
+ 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 <rodrigorivascosta@gmail.com>
* cp-tree.h (begin_for_scope): New prototype.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index dddbc01..3d39b55 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 0c64a5d..72570c3 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 b574148..8762f9a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-13 Kai Tietz <kai.tietz@onevision.com>
+
+ PR c++/47213
+ * g++.dg/ext/pr47213.C: New.
+
2011-01-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* 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 0000000..b39013c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr47213.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-fvisibility-ms-compat" }
+#include <typeinfo>
+
+template < typename T > void
+bar ()
+{
+ typeid (T);
+}
+
+void
+foo ()
+{
+ bar < int () > ();
+}