aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>1998-06-09 23:13:19 -0400
committerJason Merrill <jason@gcc.gnu.org>1998-06-09 23:13:19 -0400
commit0202018521e5aaf55b500210ddd4b603c67477ab (patch)
treefd4cb18ef47acf65e1a8266f89e6044dcb05772e /gcc
parent0365438d33268e5541586feb37fd1e490e1a874c (diff)
downloadgcc-0202018521e5aaf55b500210ddd4b603c67477ab.zip
gcc-0202018521e5aaf55b500210ddd4b603c67477ab.tar.gz
gcc-0202018521e5aaf55b500210ddd4b603c67477ab.tar.bz2
init.c (resolve_offset_ref): Handle default-initialization.
* init.c (resolve_offset_ref): Handle default-initialization. * except.c (build_throw): Handle throwing NULL. * typeck.c (build_x_function_call): Use resolve_offset_ref. * search.c (compute_access): Only strip an anonymous union for a FIELD_DECL. * call.c (add_builtin_candidates): Tweak. * cvt.c (build_expr_type_conversion): Restore code for conversion from class types. * decl2.c (delete_sanity): Use it. Clean up. * typeck.c (comp_ptr_ttypes_real): Fix cv-qual comparisons. * typeck.c (c_expand_return): Don't warn about void expressions on return statements in functions returning void. From-SVN: r20399
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog24
-rw-r--r--gcc/cp/call.c10
-rw-r--r--gcc/cp/cvt.c107
-rw-r--r--gcc/cp/decl2.c84
-rw-r--r--gcc/cp/except.c20
-rw-r--r--gcc/cp/init.c14
-rw-r--r--gcc/cp/parse.c221
-rw-r--r--gcc/cp/search.c9
-rw-r--r--gcc/cp/typeck.c37
9 files changed, 305 insertions, 221 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8fa60f4..c84e3e2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,27 @@
+1998-06-10 Jason Merrill <jason@yorick.cygnus.com>
+
+ * init.c (resolve_offset_ref): Handle default-initialization.
+
+ * except.c (build_throw): Handle throwing NULL.
+
+ * typeck.c (build_x_function_call): Use resolve_offset_ref.
+
+ * search.c (compute_access): Only strip an anonymous union
+ for a FIELD_DECL.
+
+ * call.c (add_builtin_candidates): Tweak.
+
+ * cvt.c (build_expr_type_conversion): Restore code for conversion
+ from class types.
+ * decl2.c (delete_sanity): Use it. Clean up.
+
+ * typeck.c (comp_ptr_ttypes_real): Fix cv-qual comparisons.
+
+1998-06-10 Branko Cibej <branko.cibej@hermes.si>
+
+ * typeck.c (c_expand_return): Don't warn about void expressions on
+ return statements in functions returning void.
+
1998-06-09 Mark Mitchell <mark@markmitchell.com>
* pt.c (fn_type_unification): Revise documentation. Tidy.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index cf0a21a..7a74213 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -1807,6 +1807,11 @@ add_builtin_candidates (candidates, code, code2, fnname, args, flags)
{
tree convs = lookup_conversions (argtypes[i]);
+ if (i == 0 && code == MODIFY_EXPR && code2 == NOP_EXPR)
+ return candidates;
+
+ convs = lookup_conversions (argtypes[i]);
+
if (code == COND_EXPR)
{
if (real_lvalue_p (args[i]))
@@ -1816,9 +1821,8 @@ add_builtin_candidates (candidates, code, code2, fnname, args, flags)
types[i] = scratch_tree_cons
(NULL_TREE, TYPE_MAIN_VARIANT (argtypes[i]), types[i]);
}
-
- else if (! convs || (i == 0 && code == MODIFY_EXPR
- && code2 == NOP_EXPR))
+
+ else if (! convs)
return candidates;
for (; convs; convs = TREE_CHAIN (convs))
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index abf8475..5c4c0b0 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -941,36 +941,99 @@ build_expr_type_conversion (desires, expr, complain)
int complain;
{
tree basetype = TREE_TYPE (expr);
+ tree conv;
+ tree winner = NULL_TREE;
if (TREE_CODE (basetype) == OFFSET_TYPE)
expr = resolve_offset_ref (expr);
expr = convert_from_reference (expr);
basetype = TREE_TYPE (expr);
- switch (TREE_CODE (basetype))
- {
- case INTEGER_TYPE:
- if ((desires & WANT_NULL) && TREE_CODE (expr) == INTEGER_CST
- && integer_zerop (expr))
- return expr;
- /* else fall through... */
-
- case BOOLEAN_TYPE:
- return (desires & WANT_INT) ? expr : NULL_TREE;
- case ENUMERAL_TYPE:
- return (desires & WANT_ENUM) ? expr : NULL_TREE;
- case REAL_TYPE:
- return (desires & WANT_FLOAT) ? expr : NULL_TREE;
- case POINTER_TYPE:
- return (desires & WANT_POINTER) ? expr : NULL_TREE;
+ if (! IS_AGGR_TYPE (basetype))
+ switch (TREE_CODE (basetype))
+ {
+ case INTEGER_TYPE:
+ if ((desires & WANT_NULL) && TREE_CODE (expr) == INTEGER_CST
+ && integer_zerop (expr))
+ return expr;
+ /* else fall through... */
+
+ case BOOLEAN_TYPE:
+ return (desires & WANT_INT) ? expr : NULL_TREE;
+ case ENUMERAL_TYPE:
+ return (desires & WANT_ENUM) ? expr : NULL_TREE;
+ case REAL_TYPE:
+ return (desires & WANT_FLOAT) ? expr : NULL_TREE;
+ case POINTER_TYPE:
+ return (desires & WANT_POINTER) ? expr : NULL_TREE;
- case FUNCTION_TYPE:
- case ARRAY_TYPE:
- return ((desires & WANT_POINTER) ? default_conversion (expr)
- : NULL_TREE);
+ case FUNCTION_TYPE:
+ case ARRAY_TYPE:
+ return (desires & WANT_POINTER) ? default_conversion (expr)
+ : NULL_TREE;
+ default:
+ return NULL_TREE;
+ }
+
+ /* The code for conversions from class type is currently only used for
+ delete expressions. Other expressions are handled by build_new_op. */
+
+ if (! TYPE_HAS_CONVERSION (basetype))
+ return NULL_TREE;
+
+ for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv))
+ {
+ int win = 0;
+ tree candidate;
+ tree cand = TREE_VALUE (conv);
+
+ if (winner && winner == cand)
+ continue;
+
+ candidate = TREE_TYPE (TREE_TYPE (cand));
+ if (TREE_CODE (candidate) == REFERENCE_TYPE)
+ candidate = TREE_TYPE (candidate);
+
+ switch (TREE_CODE (candidate))
+ {
+ case BOOLEAN_TYPE:
+ case INTEGER_TYPE:
+ win = (desires & WANT_INT); break;
+ case ENUMERAL_TYPE:
+ win = (desires & WANT_ENUM); break;
+ case REAL_TYPE:
+ win = (desires & WANT_FLOAT); break;
+ case POINTER_TYPE:
+ win = (desires & WANT_POINTER); break;
+
+ default:
+ break;
+ }
+
+ if (win)
+ {
+ if (winner)
+ {
+ if (complain)
+ {
+ cp_error ("ambiguous default type conversion from `%T'",
+ basetype);
+ cp_error (" candidate conversions include `%D' and `%D'",
+ winner, cand);
+ }
+ return error_mark_node;
+ }
+ else
+ winner = cand;
+ }
+ }
- default:
- break;
+ if (winner)
+ {
+ tree type = TREE_TYPE (TREE_TYPE (winner));
+ if (TREE_CODE (type) == REFERENCE_TYPE)
+ type = TREE_TYPE (type);
+ return build_user_type_conversion (type, expr, LOOKUP_NORMAL);
}
return NULL_TREE;
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 25488c2..b498599 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1236,9 +1236,7 @@ delete_sanity (exp, size, doing_vec, use_global_delete)
tree exp, size;
int doing_vec, use_global_delete;
{
- tree t;
- tree type;
- enum tree_code code;
+ tree t, type;
/* For a regular vector delete (aka, no size argument) we will pass
this down as a NULL_TREE into build_vec_delete. */
tree maxindex = NULL_TREE;
@@ -1254,65 +1252,45 @@ delete_sanity (exp, size, doing_vec, use_global_delete)
return t;
}
- t = exp;
- if (TREE_CODE (t) == OFFSET_REF)
- t = resolve_offset_ref (t);
- t = stabilize_reference (convert_from_reference (t));
- type = TREE_TYPE (t);
- code = TREE_CODE (type);
+ if (TREE_CODE (exp) == OFFSET_REF)
+ exp = resolve_offset_ref (exp);
+ exp = convert_from_reference (exp);
+ t = stabilize_reference (exp);
+ t = build_expr_type_conversion (WANT_POINTER, t, 1);
- switch (doing_vec)
+ if (t == NULL_TREE || t == error_mark_node)
{
- case 2:
- maxindex = build_binary_op (MINUS_EXPR, size, integer_one_node, 1);
- pedwarn ("anachronistic use of array size in vector delete");
- /* Fall through. */
- case 1:
- break;
- default:
- if (code != POINTER_TYPE)
- {
- cp_error ("type `%#T' argument given to `delete', expected pointer",
- type);
- return error_mark_node;
- }
-
- /* Deleting a pointer with the value zero is valid and has no effect. */
- if (integer_zerop (t))
- return build1 (NOP_EXPR, void_type_node, t);
+ cp_error ("type `%#T' argument given to `delete', expected pointer",
+ TREE_TYPE (exp));
+ return error_mark_node;
}
- if (code == POINTER_TYPE)
+ if (doing_vec == 2)
{
-#if 0
- /* As of Valley Forge, you can delete a pointer to const. */
- if (TREE_READONLY (TREE_TYPE (type)))
- {
- error ("`const *' cannot be deleted");
- return error_mark_node;
- }
-#endif
- /* You can't delete functions. */
- if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
- {
- error ("cannot delete a function");
- return error_mark_node;
- }
+ maxindex = build_binary_op (MINUS_EXPR, size, integer_one_node, 1);
+ pedwarn ("anachronistic use of array size in vector delete");
}
-#if 0
- /* If the type has no destructor, then we should build a regular
- delete, instead of a vector delete. Otherwise, we would end
- up passing a bogus offset into __builtin_delete, which is
- not expecting it. */
- if (doing_vec
- && TREE_CODE (type) == POINTER_TYPE
- && !TYPE_HAS_DESTRUCTOR (TREE_TYPE (type)))
+ type = TREE_TYPE (t);
+
+ /* As of Valley Forge, you can delete a pointer to const. */
+
+ /* You can't delete functions. */
+ if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
{
- doing_vec = 0;
- use_global_delete = 1;
+ error ("cannot delete a function");
+ return error_mark_node;
}
-#endif
+
+ /* An array can't have been allocated by new, so complain. */
+ if (TREE_CODE (t) == ADDR_EXPR
+ && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL
+ && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == ARRAY_TYPE)
+ cp_warning ("deleting array `%#D'", TREE_OPERAND (t, 0));
+
+ /* Deleting a pointer with the value zero is valid and has no effect. */
+ if (integer_zerop (t))
+ return build1 (NOP_EXPR, void_type_node, t);
if (doing_vec)
return build_vec_delete (t, maxindex, integer_one_node,
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index d5859f8..dba0f09 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -1077,13 +1077,21 @@ tree
build_throw (e)
tree e;
{
- if (e != error_mark_node)
+ if (e == error_mark_node)
+ return e;
+
+ if (processing_template_decl)
+ return build_min (THROW_EXPR, void_type_node, e);
+
+ if (! flag_ansi && e == null_node)
{
- if (processing_template_decl)
- return build_min (THROW_EXPR, void_type_node, e);
- e = build1 (THROW_EXPR, void_type_node, e);
- TREE_SIDE_EFFECTS (e) = 1;
- TREE_USED (e) = 1;
+ cp_warning ("throwing NULL");
+ e = integer_zero_node;
}
+
+ e = build1 (THROW_EXPR, void_type_node, e);
+ TREE_SIDE_EFFECTS (e) = 1;
+ TREE_USED (e) = 1;
+
return e;
}
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index c9de483..828729c 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -197,9 +197,11 @@ perform_member_init (member, name, init, explicit)
{
if (explicit)
{
- cp_error ("incomplete initializer for member `%D' of class `%T' which has no constructor",
- member, current_class_type);
- init = error_mark_node;
+ /* default-initialization. */
+ if (AGGREGATE_TYPE_P (type))
+ init = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
+ else
+ init = integer_zero_node;
}
/* member traversal: note it leaves init NULL */
else if (TREE_CODE (TREE_TYPE (member)) == REFERENCE_TYPE)
@@ -222,7 +224,8 @@ perform_member_init (member, name, init, explicit)
current_member_init_list. */
if (init || explicit)
{
- decl = build_component_ref (current_class_ref, name, NULL_TREE, explicit);
+ decl = build_component_ref (current_class_ref, name, NULL_TREE,
+ explicit);
expand_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
}
}
@@ -238,7 +241,8 @@ perform_member_init (member, name, init, explicit)
push_obstacks_nochange ();
resume_temporary_allocation ();
- expr = build_component_ref (current_class_ref, name, NULL_TREE, explicit);
+ expr = build_component_ref (current_class_ref, name, NULL_TREE,
+ explicit);
expr = build_delete (type, expr, integer_zero_node,
LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
diff --git a/gcc/cp/parse.c b/gcc/cp/parse.c
index 481a1ff..3f5f4f2 100644
--- a/gcc/cp/parse.c
+++ b/gcc/cp/parse.c
@@ -697,18 +697,18 @@ static const short yyrline[] = { 0,
3174, 3176, 3178, 3180, 3183, 3184, 3186, 3189, 3190, 3193,
3193, 3196, 3196, 3199, 3199, 3201, 3203, 3205, 3207, 3213,
3219, 3222, 3225, 3231, 3233, 3235, 3239, 3241, 3244, 3251,
- 3257, 3266, 3270, 3272, 3275, 3277, 3280, 3284, 3286, 3289,
- 3291, 3294, 3311, 3317, 3325, 3327, 3329, 3333, 3336, 3337,
- 3345, 3349, 3353, 3356, 3357, 3363, 3366, 3369, 3371, 3375,
- 3380, 3383, 3393, 3398, 3399, 3406, 3409, 3412, 3414, 3417,
- 3419, 3429, 3443, 3447, 3450, 3452, 3456, 3460, 3463, 3466,
- 3468, 3472, 3474, 3481, 3488, 3491, 3494, 3498, 3502, 3508,
- 3512, 3517, 3519, 3522, 3527, 3533, 3544, 3547, 3549, 3553,
- 3558, 3560, 3567, 3570, 3572, 3574, 3580, 3585, 3588, 3590,
- 3592, 3594, 3596, 3598, 3600, 3602, 3604, 3606, 3608, 3610,
- 3612, 3614, 3616, 3618, 3620, 3622, 3624, 3626, 3628, 3630,
- 3632, 3634, 3636, 3638, 3640, 3642, 3644, 3646, 3648, 3650,
- 3653, 3655
+ 3257, 3265, 3269, 3271, 3274, 3276, 3279, 3283, 3285, 3288,
+ 3290, 3293, 3310, 3316, 3324, 3326, 3328, 3332, 3335, 3336,
+ 3344, 3348, 3352, 3355, 3356, 3362, 3365, 3368, 3370, 3374,
+ 3379, 3382, 3392, 3397, 3398, 3405, 3408, 3411, 3413, 3416,
+ 3418, 3428, 3442, 3446, 3449, 3451, 3455, 3459, 3462, 3465,
+ 3467, 3471, 3473, 3480, 3487, 3490, 3493, 3497, 3501, 3507,
+ 3511, 3516, 3518, 3521, 3526, 3532, 3543, 3546, 3548, 3552,
+ 3557, 3559, 3566, 3569, 3571, 3573, 3579, 3584, 3587, 3589,
+ 3591, 3593, 3595, 3597, 3599, 3601, 3603, 3605, 3607, 3609,
+ 3611, 3613, 3615, 3617, 3619, 3621, 3623, 3625, 3627, 3629,
+ 3631, 3633, 3635, 3637, 3639, 3641, 3643, 3645, 3647, 3649,
+ 3652, 3654
};
#endif
@@ -7185,7 +7185,7 @@ case 730:
#line 3252 "parse.y"
{
expand_start_all_catch ();
- expand_start_catch (NULL);
+ start_catch_handler (NULL);
;
break;}
case 731:
@@ -7194,46 +7194,45 @@ case 731:
int nested = (hack_decl_function_context
(current_function_decl) != NULL_TREE);
expand_end_all_catch ();
- expand_end_catch ();
finish_function (lineno, (int)yyvsp[-3].itype, nested);
;
break;}
case 732:
-#line 3268 "parse.y"
+#line 3267 "parse.y"
{ yyval.ttype = begin_try_block (); ;
break;}
case 733:
-#line 3270 "parse.y"
+#line 3269 "parse.y"
{ finish_try_block (yyvsp[-1].ttype); ;
break;}
case 734:
-#line 3272 "parse.y"
+#line 3271 "parse.y"
{ finish_handler_sequence (yyvsp[-3].ttype); ;
break;}
case 737:
-#line 3282 "parse.y"
+#line 3281 "parse.y"
{ yyval.ttype = begin_handler(); ;
break;}
case 738:
-#line 3284 "parse.y"
+#line 3283 "parse.y"
{ finish_handler_parms (yyvsp[-1].ttype); ;
break;}
case 739:
-#line 3286 "parse.y"
+#line 3285 "parse.y"
{ finish_handler (yyvsp[-3].ttype); ;
break;}
case 742:
-#line 3296 "parse.y"
+#line 3295 "parse.y"
{ expand_start_catch_block (NULL_TREE, NULL_TREE); ;
break;}
case 743:
-#line 3312 "parse.y"
+#line 3311 "parse.y"
{ check_for_new_type ("inside exception declarations", yyvsp[-1].ftype);
expand_start_catch_block (TREE_PURPOSE (yyvsp[-1].ftype.t),
TREE_VALUE (yyvsp[-1].ftype.t)); ;
break;}
case 744:
-#line 3319 "parse.y"
+#line 3318 "parse.y"
{ tree label;
do_label:
label = define_label (input_filename, lineno, yyvsp[-1].ttype);
@@ -7242,98 +7241,98 @@ case 744:
;
break;}
case 745:
-#line 3326 "parse.y"
+#line 3325 "parse.y"
{ goto do_label; ;
break;}
case 746:
-#line 3328 "parse.y"
+#line 3327 "parse.y"
{ goto do_label; ;
break;}
case 747:
-#line 3330 "parse.y"
+#line 3329 "parse.y"
{ goto do_label; ;
break;}
case 748:
-#line 3335 "parse.y"
+#line 3334 "parse.y"
{ if (yyvsp[-1].ttype) cplus_expand_expr_stmt (yyvsp[-1].ttype); ;
break;}
case 750:
-#line 3338 "parse.y"
+#line 3337 "parse.y"
{ if (pedantic)
pedwarn ("ANSI C++ forbids compound statements inside for initializations");
;
break;}
case 751:
-#line 3347 "parse.y"
+#line 3346 "parse.y"
{ emit_line_note (input_filename, lineno);
yyval.ttype = NULL_TREE; ;
break;}
case 752:
-#line 3350 "parse.y"
+#line 3349 "parse.y"
{ emit_line_note (input_filename, lineno); ;
break;}
case 753:
-#line 3355 "parse.y"
+#line 3354 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 755:
-#line 3358 "parse.y"
+#line 3357 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 756:
-#line 3365 "parse.y"
+#line 3364 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 759:
-#line 3372 "parse.y"
+#line 3371 "parse.y"
{ yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ;
break;}
case 760:
-#line 3377 "parse.y"
+#line 3376 "parse.y"
{ yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ;
break;}
case 761:
-#line 3382 "parse.y"
+#line 3381 "parse.y"
{ yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, NULL_TREE); ;
break;}
case 762:
-#line 3384 "parse.y"
+#line 3383 "parse.y"
{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ;
break;}
case 763:
-#line 3395 "parse.y"
+#line 3394 "parse.y"
{
yyval.ttype = empty_parms();
;
break;}
case 765:
-#line 3400 "parse.y"
+#line 3399 "parse.y"
{ yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[0].ftype.t), 0);
check_for_new_type ("inside parameter list", yyvsp[0].ftype); ;
break;}
case 766:
-#line 3408 "parse.y"
+#line 3407 "parse.y"
{ yyval.ttype = finish_parmlist (yyval.ttype, 0); ;
break;}
case 767:
-#line 3410 "parse.y"
+#line 3409 "parse.y"
{ yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ;
break;}
case 768:
-#line 3413 "parse.y"
+#line 3412 "parse.y"
{ yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ;
break;}
case 769:
-#line 3415 "parse.y"
+#line 3414 "parse.y"
{ yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE,
yyvsp[-1].ftype.t), 1); ;
break;}
case 770:
-#line 3418 "parse.y"
+#line 3417 "parse.y"
{ yyval.ttype = finish_parmlist (NULL_TREE, 1); ;
break;}
case 771:
-#line 3420 "parse.y"
+#line 3419 "parse.y"
{
/* This helps us recover from really nasty
parse errors, for example, a missing right
@@ -7345,7 +7344,7 @@ case 771:
;
break;}
case 772:
-#line 3430 "parse.y"
+#line 3429 "parse.y"
{
/* This helps us recover from really nasty
parse errors, for example, a missing right
@@ -7358,98 +7357,98 @@ case 772:
;
break;}
case 773:
-#line 3445 "parse.y"
+#line 3444 "parse.y"
{ maybe_snarf_defarg (); ;
break;}
case 774:
-#line 3447 "parse.y"
+#line 3446 "parse.y"
{ yyval.ttype = yyvsp[0].ttype; ;
break;}
case 777:
-#line 3458 "parse.y"
+#line 3457 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[0].ftype);
yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ;
break;}
case 778:
-#line 3461 "parse.y"
+#line 3460 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[-1].ftype);
yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); ;
break;}
case 779:
-#line 3464 "parse.y"
+#line 3463 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[0].ftype);
yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ;
break;}
case 780:
-#line 3467 "parse.y"
+#line 3466 "parse.y"
{ yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
break;}
case 781:
-#line 3469 "parse.y"
+#line 3468 "parse.y"
{ yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ;
break;}
case 783:
-#line 3475 "parse.y"
+#line 3474 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[-1].ftype);
yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); ;
break;}
case 784:
-#line 3485 "parse.y"
+#line 3484 "parse.y"
{ tree specs = strip_attrs (yyvsp[-1].ftype.t);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag;
yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); ;
break;}
case 785:
-#line 3489 "parse.y"
+#line 3488 "parse.y"
{ yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 786:
-#line 3492 "parse.y"
+#line 3491 "parse.y"
{ yyval.ftype.t = build_tree_list (get_decl_list (yyvsp[-1].ftype.t), yyvsp[0].ttype);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 787:
-#line 3495 "parse.y"
+#line 3494 "parse.y"
{ tree specs = strip_attrs (yyvsp[-1].ftype.t);
yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 788:
-#line 3499 "parse.y"
+#line 3498 "parse.y"
{ tree specs = strip_attrs (yyvsp[0].ftype.t);
yyval.ftype.t = build_tree_list (specs, NULL_TREE);
yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ;
break;}
case 789:
-#line 3503 "parse.y"
+#line 3502 "parse.y"
{ tree specs = strip_attrs (yyvsp[-1].ttype);
yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype);
yyval.ftype.new_type_flag = 0; ;
break;}
case 790:
-#line 3510 "parse.y"
+#line 3509 "parse.y"
{ yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t);
yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ;
break;}
case 791:
-#line 3513 "parse.y"
+#line 3512 "parse.y"
{ yyval.ftype.t = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 794:
-#line 3524 "parse.y"
+#line 3523 "parse.y"
{ see_typename (); ;
break;}
case 795:
-#line 3529 "parse.y"
+#line 3528 "parse.y"
{
error ("type specifier omitted for parameter");
yyval.ttype = build_tree_list (integer_type_node, NULL_TREE);
;
break;}
case 796:
-#line 3534 "parse.y"
+#line 3533 "parse.y"
{
error ("type specifier omitted for parameter");
if (TREE_CODE (yyval.ttype) == SCOPE_REF
@@ -7460,188 +7459,188 @@ case 796:
;
break;}
case 797:
-#line 3546 "parse.y"
+#line 3545 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 798:
-#line 3548 "parse.y"
+#line 3547 "parse.y"
{ yyval.ttype = yyvsp[-1].ttype; ;
break;}
case 799:
-#line 3550 "parse.y"
+#line 3549 "parse.y"
{ yyval.ttype = build_decl_list (NULL_TREE, NULL_TREE); ;
break;}
case 800:
-#line 3555 "parse.y"
+#line 3554 "parse.y"
{ yyval.ttype = build_decl_list (NULL_TREE, groktypename(yyvsp[0].ftype.t)); ;
break;}
case 802:
-#line 3561 "parse.y"
+#line 3560 "parse.y"
{
TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype;
yyval.ttype = yyvsp[0].ttype;
;
break;}
case 803:
-#line 3569 "parse.y"
+#line 3568 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 804:
-#line 3571 "parse.y"
+#line 3570 "parse.y"
{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 805:
-#line 3573 "parse.y"
+#line 3572 "parse.y"
{ yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 806:
-#line 3575 "parse.y"
+#line 3574 "parse.y"
{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype);
yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg);
;
break;}
case 807:
-#line 3582 "parse.y"
+#line 3581 "parse.y"
{ got_scope = NULL_TREE; ;
break;}
case 808:
-#line 3587 "parse.y"
+#line 3586 "parse.y"
{ yyval.ttype = ansi_opname[MULT_EXPR]; ;
break;}
case 809:
-#line 3589 "parse.y"
+#line 3588 "parse.y"
{ yyval.ttype = ansi_opname[TRUNC_DIV_EXPR]; ;
break;}
case 810:
-#line 3591 "parse.y"
+#line 3590 "parse.y"
{ yyval.ttype = ansi_opname[TRUNC_MOD_EXPR]; ;
break;}
case 811:
-#line 3593 "parse.y"
+#line 3592 "parse.y"
{ yyval.ttype = ansi_opname[PLUS_EXPR]; ;
break;}
case 812:
-#line 3595 "parse.y"
+#line 3594 "parse.y"
{ yyval.ttype = ansi_opname[MINUS_EXPR]; ;
break;}
case 813:
-#line 3597 "parse.y"
+#line 3596 "parse.y"
{ yyval.ttype = ansi_opname[BIT_AND_EXPR]; ;
break;}
case 814:
-#line 3599 "parse.y"
+#line 3598 "parse.y"
{ yyval.ttype = ansi_opname[BIT_IOR_EXPR]; ;
break;}
case 815:
-#line 3601 "parse.y"
+#line 3600 "parse.y"
{ yyval.ttype = ansi_opname[BIT_XOR_EXPR]; ;
break;}
case 816:
-#line 3603 "parse.y"
+#line 3602 "parse.y"
{ yyval.ttype = ansi_opname[BIT_NOT_EXPR]; ;
break;}
case 817:
-#line 3605 "parse.y"
+#line 3604 "parse.y"
{ yyval.ttype = ansi_opname[COMPOUND_EXPR]; ;
break;}
case 818:
-#line 3607 "parse.y"
+#line 3606 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 819:
-#line 3609 "parse.y"
+#line 3608 "parse.y"
{ yyval.ttype = ansi_opname[LT_EXPR]; ;
break;}
case 820:
-#line 3611 "parse.y"
+#line 3610 "parse.y"
{ yyval.ttype = ansi_opname[GT_EXPR]; ;
break;}
case 821:
-#line 3613 "parse.y"
+#line 3612 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 822:
-#line 3615 "parse.y"
+#line 3614 "parse.y"
{ yyval.ttype = ansi_assopname[yyvsp[0].code]; ;
break;}
case 823:
-#line 3617 "parse.y"
+#line 3616 "parse.y"
{ yyval.ttype = ansi_opname [MODIFY_EXPR]; ;
break;}
case 824:
-#line 3619 "parse.y"
+#line 3618 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 825:
-#line 3621 "parse.y"
+#line 3620 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 826:
-#line 3623 "parse.y"
+#line 3622 "parse.y"
{ yyval.ttype = ansi_opname[POSTINCREMENT_EXPR]; ;
break;}
case 827:
-#line 3625 "parse.y"
+#line 3624 "parse.y"
{ yyval.ttype = ansi_opname[PREDECREMENT_EXPR]; ;
break;}
case 828:
-#line 3627 "parse.y"
+#line 3626 "parse.y"
{ yyval.ttype = ansi_opname[TRUTH_ANDIF_EXPR]; ;
break;}
case 829:
-#line 3629 "parse.y"
+#line 3628 "parse.y"
{ yyval.ttype = ansi_opname[TRUTH_ORIF_EXPR]; ;
break;}
case 830:
-#line 3631 "parse.y"
+#line 3630 "parse.y"
{ yyval.ttype = ansi_opname[TRUTH_NOT_EXPR]; ;
break;}
case 831:
-#line 3633 "parse.y"
+#line 3632 "parse.y"
{ yyval.ttype = ansi_opname[COND_EXPR]; ;
break;}
case 832:
-#line 3635 "parse.y"
+#line 3634 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 833:
-#line 3637 "parse.y"
+#line 3636 "parse.y"
{ yyval.ttype = ansi_opname[COMPONENT_REF]; ;
break;}
case 834:
-#line 3639 "parse.y"
+#line 3638 "parse.y"
{ yyval.ttype = ansi_opname[MEMBER_REF]; ;
break;}
case 835:
-#line 3641 "parse.y"
+#line 3640 "parse.y"
{ yyval.ttype = ansi_opname[CALL_EXPR]; ;
break;}
case 836:
-#line 3643 "parse.y"
+#line 3642 "parse.y"
{ yyval.ttype = ansi_opname[ARRAY_REF]; ;
break;}
case 837:
-#line 3645 "parse.y"
+#line 3644 "parse.y"
{ yyval.ttype = ansi_opname[NEW_EXPR]; ;
break;}
case 838:
-#line 3647 "parse.y"
+#line 3646 "parse.y"
{ yyval.ttype = ansi_opname[DELETE_EXPR]; ;
break;}
case 839:
-#line 3649 "parse.y"
+#line 3648 "parse.y"
{ yyval.ttype = ansi_opname[VEC_NEW_EXPR]; ;
break;}
case 840:
-#line 3651 "parse.y"
+#line 3650 "parse.y"
{ yyval.ttype = ansi_opname[VEC_DELETE_EXPR]; ;
break;}
case 841:
-#line 3654 "parse.y"
+#line 3653 "parse.y"
{ yyval.ttype = grokoptypename (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
break;}
case 842:
-#line 3656 "parse.y"
+#line 3655 "parse.y"
{ yyval.ttype = ansi_opname[ERROR_MARK]; ;
break;}
}
@@ -7842,7 +7841,7 @@ yyerrhandle:
yystate = yyn;
goto yynewstate;
}
-#line 3659 "parse.y"
+#line 3658 "parse.y"
#ifdef SPEW_DEBUG
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index e92e8d8..4bece8b 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -961,15 +961,14 @@ compute_access (basetype_path, field)
return access_public_node;
previous_scope = current_scope ();
-
- context = DECL_CLASS_CONTEXT (field);
- if (context == NULL_TREE)
- context = DECL_CONTEXT (field);
+
+ context = DECL_REAL_CONTEXT (field);
/* Fields coming from nested anonymous unions have their DECL_CLASS_CONTEXT
slot set to the union type rather than the record type containing
the anonymous union. */
- if (context && ANON_UNION_TYPE_P (context))
+ if (context && ANON_UNION_TYPE_P (context)
+ && TREE_CODE (field) == FIELD_DECL)
context = TYPE_CONTEXT (context);
/* Virtual function tables are never private. But we should know that
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index f394f40..8156398 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -2564,8 +2564,19 @@ build_x_function_call (function, params, decl)
decl = current_class_ref;
decl_addr = build_unary_op (ADDR_EXPR, decl, 0);
- function = get_member_function_from_ptrfunc (&decl_addr,
- TREE_OPERAND (function, 1));
+
+ /* Sigh. OFFSET_REFs are being used for too many things.
+ They're being used both for -> and ->*, and we want to resolve
+ the -> cases here, but leave the ->*. We could use
+ resolve_offset_ref for those, too, but it would call
+ get_member_function_from_ptrfunc and decl_addr wouldn't get
+ updated properly. Nasty. */
+ if (TREE_CODE (TREE_OPERAND (function, 1)) == FIELD_DECL)
+ function = resolve_offset_ref (function);
+ else
+ function = TREE_OPERAND (function, 1);
+
+ function = get_member_function_from_ptrfunc (&decl_addr, function);
params = expr_tree_cons (NULL_TREE, decl_addr, params);
return build_function_call (function, params);
}
@@ -7271,8 +7282,7 @@ c_expand_return (retval)
if (valtype == NULL_TREE || TREE_CODE (valtype) == VOID_TYPE)
{
current_function_returns_null = 1;
- if ((pedantic && ! DECL_ARTIFICIAL (current_function_decl))
- || TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
+ if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
pedwarn ("`return' with a value, in function returning void");
expand_return (retval);
return;
@@ -7477,22 +7487,17 @@ comp_ptr_ttypes_real (to, from, constp)
so the usual checks are not appropriate. */
if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
{
- switch (comp_cv_qualification (from, to))
- {
- case 1:
- /* FROM is more cv-qualified than TO. */
- return 0;
+ if (TYPE_READONLY (from) > TYPE_READONLY (to)
+ || TYPE_VOLATILE (from) > TYPE_VOLATILE (to))
+ return 0;
- case -1:
- /* TO is more cv-qualified than FROM. */
+ if (TYPE_READONLY (to) > TYPE_READONLY (from)
+ || TYPE_VOLATILE (to) > TYPE_VOLATILE (from))
+ {
if (constp == 0)
return 0;
- else
+ else
++to_more_cv_qualified;
- break;
-
- default:
- break;
}
if (constp > 0)