diff options
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/class.c | 12 | ||||
-rw-r--r-- | gcc/cp/pt.c | 3 |
3 files changed, 19 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9d13f3d..4adb918 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2003-12-25 Andrew Pinski <pinskia@physics.uc.edu> + + PR c++/13268, c++/13339 + * class.c (add_method): Return early when method is error_mark_node. + * pt.c (tsubst_friend_function): Return early when new_friend is + error_mark_node. + 2003-12-23 Mark Mitchell <mark@codesourcery.com> * cp-lang.c (cp_expr_size): Return zero for empty classes. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index d110295..2928dd3 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -725,12 +725,18 @@ modify_vtable_entry (tree t, void add_method (tree type, tree method, int error_p) { - int using = (DECL_CONTEXT (method) != type); + int using; int len; int slot; tree method_vec; - int template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL - && DECL_TEMPLATE_CONV_FN_P (method)); + int template_conv_p; + + if (method == error_mark_node) + return; + + using = (DECL_CONTEXT (method) != type); + template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL + && DECL_TEMPLATE_CONV_FN_P (method)); if (!CLASSTYPE_METHOD_VEC (type)) /* Make a new method vector. We start with 8 entries. We must diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e7a8863..3c0e7d8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4897,6 +4897,9 @@ tsubst_friend_function (tree decl, tree args) Then, in S<int>, template <class U> void f(int, U) is not an instantiation of anything. */ + if (new_friend == error_mark_node) + return error_mark_node; + DECL_USE_TEMPLATE (new_friend) = 0; if (TREE_CODE (decl) == TEMPLATE_DECL) { |