summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>1999-03-19 01:21:05 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>1999-03-19 01:21:05 +0000
commitd557c99663406e63fbd353897e4a6bb87e6d2af9 (patch)
tree4848bb759d2f48031ec0df3b8a181910c50671f1
parentcaeb024942d706e69f31efea9504aa8c5e79a73a (diff)
downloadgcc-d557c99663406e63fbd353897e4a6bb87e6d2af9.tar.gz
* friend.c (make_friend_class): Avoid core dump when
not-yet-defined friend type lacks TYPE_LANG_SPECIFIC(). * decl.c (start_function): Suppress normal linkage heuristics for #pragma interface under MULTIPLE_SYMBOL_SPACES. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25857 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/decl.c14
-rw-r--r--gcc/cp/friend.c3
3 files changed, 26 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ddbecb58091..18766012742 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+1999-03-19 Chip Salzenberg <chip@perlsupport.com>
+
+ * friend.c (make_friend_class): Avoid core dump when
+ not-yet-defined friend type lacks TYPE_LANG_SPECIFIC().
+
+1999-03-18 Jason Merrill <jason@yorick.cygnus.com>
+
+ * decl.c (start_function): Suppress normal linkage heuristics
+ for #pragma interface under MULTIPLE_SYMBOL_SPACES.
+
1999-03-19 Alexandre Oliva <oliva@dcc.unicamp.br>
* Make-lang.in: ($(INTL_TARGETS)): depend on cp/parse.c
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index a416c2d7be9..200c8c40772 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -13133,6 +13133,20 @@ start_function (declspecs, declarator, attrs, pre_parsed_p)
DECL_NOT_REALLY_EXTERN (decl1) = 0;
DECL_INTERFACE_KNOWN (decl1) = 1;
}
+ else if (interface_unknown && interface_only
+ && (! DECL_TEMPLATE_INSTANTIATION (decl1)
+ || flag_alt_external_templates))
+ {
+ /* If MULTIPLE_SYMBOL_SPACES is defined and we saw a #pragma
+ interface, we will have interface_only set but not
+ interface_known. In that case, we don't want to use the normal
+ heuristics because someone will supply a #pragma implementation
+ elsewhere, and deducing it here would produce a conflict. */
+ comdat_linkage (decl1);
+ DECL_EXTERNAL (decl1) = 0;
+ DECL_INTERFACE_KNOWN (decl1) = 1;
+ DECL_DEFER_OUTPUT (decl1) = 1;
+ }
else
{
/* This is a definition, not a reference.
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index 8bcdcc40a2e..30b3c510972 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -263,7 +263,8 @@ make_friend_class (type, friend_type)
return;
}
- if (CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
+ if (CLASS_TYPE_P (friend_type)
+ && CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
&& uses_template_parms (friend_type))
{
/* [temp.friend]