aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-10-07 16:41:48 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-10-07 16:41:48 +0000
commitc219b878772bda4a2235e52ec715e295a8c204ad (patch)
tree4466036bfc96a1e2dc96a4a1bdadce1fe995ec1d
parentab150fb1894fda0eab14187338834d656de2a52a (diff)
downloadgcc-c219b878772bda4a2235e52ec715e295a8c204ad.zip
gcc-c219b878772bda4a2235e52ec715e295a8c204ad.tar.gz
gcc-c219b878772bda4a2235e52ec715e295a8c204ad.tar.bz2
friend.c (make_friend_class): Robustify.
* friend.c (make_friend_class): Robustify. * semantics.c (finish_object_call_expr): Reject calls to template types. From-SVN: r29855
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/friend.c15
-rw-r--r--gcc/cp/semantics.c2
3 files changed, 20 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0a64b4d..526edb1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+1999-10-07 Mark Mitchell <mark@codesourcery.com>
+
+ * friend.c (make_friend_class): Robustify.
+
+ * semantics.c (finish_object_call_expr): Reject calls to template
+ types.
+
1999-10-06 Mark Mitchell <mark@codesourcery.com>
* dump.c (dequeue_and_dump): Dump all three operands to a COND_EXPR.
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index 410eaf5..d2325f3 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -277,7 +277,8 @@ make_friend_class (type, friend_type)
is_template_friend = 0;
if (is_template_friend
- && TREE_CODE (friend_type) == TYPENAME_TYPE)
+ && (TREE_CODE (friend_type) == TYPENAME_TYPE
+ || TREE_CODE (friend_type) == TEMPLATE_TYPE_PARM))
{
/* [temp.friend]
@@ -290,9 +291,17 @@ make_friend_class (type, friend_type)
template <class T> friend typename S<T>::X;
+ or:
+
+ template <class T> friend class T;
+
which isn't any of these. */
- cp_error ("typename type `%T' declared `friend'",
- friend_type);
+ if (TREE_CODE (friend_type) == TYPENAME_TYPE)
+ cp_error ("typename type `%T' declared `friend'",
+ friend_type);
+ else
+ cp_error ("template parameter type `%T' declared `friend'",
+ friend_type);
return;
}
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index eb94da0..da17d3b 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1480,7 +1480,7 @@ finish_object_call_expr (fn, object, args)
tree real_fn = build_component_ref (object, fn, NULL_TREE, 1);
return finish_call_expr (real_fn, args);
#else
- if (TREE_CODE (fn) == TYPE_DECL)
+ if (DECL_DECLARES_TYPE_P (fn))
{
if (processing_template_decl)
/* This can happen on code like: