diff options
author | Mark Mitchell <mark@codesourcery.com> | 1999-10-07 16:41:48 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1999-10-07 16:41:48 +0000 |
commit | c219b878772bda4a2235e52ec715e295a8c204ad (patch) | |
tree | 4466036bfc96a1e2dc96a4a1bdadce1fe995ec1d | |
parent | ab150fb1894fda0eab14187338834d656de2a52a (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/friend.c | 15 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 2 |
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: |