From 8bcc97de27e9a426f70456fc2c9746f1831e33bd Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 24 May 1999 00:47:01 +0000 Subject: [PATCH] decl.c (lookup_tag): Remove code no longer needed after name-lookup improvements. * decl.c (lookup_tag): Remove code no longer needed after name-lookup improvements. * decl2.c (handle_class_head): Make error-recovery more robust. * friend.c (make_friend_class): Reject templated typename types. * lex.c (is_global): A template parameter isn't global. * parse.y (class_head): Robustify. * parse.c: Regenerated. From-SVN: r27117 --- gcc/cp/ChangeLog | 10 + gcc/cp/decl.c | 53 -- gcc/cp/decl2.c | 5 +- gcc/cp/friend.c | 22 +- gcc/cp/lex.c | 6 + gcc/cp/parse.c | 742 ++++++++++---------- gcc/cp/parse.y | 6 +- gcc/testsuite/g++.old-deja/g++.pt/crash43.C | 24 + 8 files changed, 441 insertions(+), 427 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash43.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 54c98b81b59..cf71347a274 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +1999-05-24 Mark Mitchell + + * decl.c (lookup_tag): Remove code no longer needed after + name-lookup improvements. + * decl2.c (handle_class_head): Make error-recovery more robust. + * friend.c (make_friend_class): Reject templated typename types. + * lex.c (is_global): A template parameter isn't global. + * parse.y (class_head): Robustify. + * parse.c: Regenerated. + 1999-05-22 Mark Mitchell * pt.c (for_each_template_parm): Walk into TYPENAME_TYPEs, diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2308e4c4b7e..cd9955536b9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5251,59 +5251,6 @@ lookup_tag (form, name, binding_level, thislevel_only) else return NULL_TREE; } - if (current_class_type && level->level_chain->namespace_p) - { - /* Try looking in this class's tags before heading into - global binding level. */ - tree context = current_class_type; - while (context) - { - switch (TREE_CODE_CLASS (TREE_CODE (context))) - { - tree these_tags; - case 't': - these_tags = CLASSTYPE_TAGS (context); - if (ANON_AGGRNAME_P (name)) - while (these_tags) - { - if (TYPE_IDENTIFIER (TREE_VALUE (these_tags)) - == name) - return TREE_VALUE (tail); - these_tags = TREE_CHAIN (these_tags); - } - else - while (these_tags) - { - if (TREE_PURPOSE (these_tags) == name) - { - if (TREE_CODE (TREE_VALUE (these_tags)) != form) - { - cp_error ("`%#D' redeclared as %C in class scope", - TREE_VALUE (tail), form); - return NULL_TREE; - } - return TREE_VALUE (tail); - } - these_tags = TREE_CHAIN (these_tags); - } - /* If this type is not yet complete, then don't - look at its context. */ - if (TYPE_SIZE (context) == NULL_TREE) - goto no_context; - /* Go to next enclosing type, if any. */ - context = DECL_CONTEXT (TYPE_MAIN_DECL (context)); - break; - case 'd': - context = DECL_CONTEXT (context); - break; - default: - my_friendly_abort (10); - } - continue; - no_context: - break; - } - } } return NULL_TREE; } diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index d82fb1c9cdd..9427c2c6ba4 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -5257,7 +5257,10 @@ handle_class_head (aggr, scope, id) else { if (scope) - cp_error ("`%T' does not have a nested type named `%D'", scope, id); + { + cp_error ("`%T' does not have a nested type named `%D'", scope, id); + return error_mark_node; + } else cp_error ("no file-scope type named `%D'", id); diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c index 5085ebc7747..07cda8f1cfc 100644 --- a/gcc/cp/friend.c +++ b/gcc/cp/friend.c @@ -266,7 +266,7 @@ make_friend_class (type, friend_type) friend_type); return; } - + if (processing_template_decl > template_class_depth (type)) /* If the TYPE is a template then it makes sense for it to be friends with itself; this means that each instantiation is @@ -281,6 +281,26 @@ make_friend_class (type, friend_type) else is_template_friend = 0; + if (is_template_friend + && TREE_CODE (friend_type) == TYPENAME_TYPE) + { + /* [temp.friend] + + A friend of a class or class template can be a function or + class template, a specialization of a function template or + class template, or an ordinary (nontemplate) function or + class. + + But, we're looking at something like: + + template friend typename S::X; + + which isn't any of these. */ + cp_error ("typename type `%T' declare `friend'", + friend_type); + return; + } + GNU_xref_hier (type, friend_type, 0, 0, 1); if (is_template_friend) diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index db8fdd50db2..9d074ca726b 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -2831,6 +2831,12 @@ is_global (d) case TREE_LIST: d = TREE_VALUE (d); continue; default: my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (d)) == 'd', 980629); + + /* A template parameter is not really global, even though it + has no enclosing scope. */ + if (DECL_TEMPLATE_PARM_P (d)) + return 0; + d = CP_DECL_CONTEXT (d); return TREE_CODE (d) == NAMESPACE_DECL; } diff --git a/gcc/cp/parse.c b/gcc/cp/parse.c index f5285b3a885..a6c67aa2b55 100644 --- a/gcc/cp/parse.c +++ b/gcc/cp/parse.c @@ -693,46 +693,46 @@ static const short yyrline[] = { 0, 2031, 2034, 2040, 2043, 2046, 2048, 2050, 2054, 2060, 2068, 2075, 2079, 2081, 2086, 2089, 2092, 2094, 2096, 2100, 2105, 2112, 2116, 2120, 2127, 2131, 2134, 2137, 2143, 2145, 2157, - 2161, 2166, 2188, 2190, 2193, 2195, 2200, 2202, 2204, 2206, - 2208, 2210, 2214, 2222, 2225, 2227, 2231, 2238, 2244, 2250, - 2256, 2266, 2272, 2276, 2283, 2311, 2321, 2327, 2330, 2333, - 2335, 2339, 2341, 2345, 2350, 2356, 2359, 2360, 2381, 2404, - 2406, 2410, 2421, 2435, 2436, 2437, 2438, 2441, 2456, 2461, - 2467, 2469, 2474, 2476, 2478, 2480, 2482, 2484, 2487, 2497, - 2504, 2529, 2535, 2538, 2541, 2543, 2554, 2559, 2562, 2567, - 2570, 2577, 2587, 2590, 2597, 2607, 2609, 2612, 2614, 2617, - 2624, 2632, 2639, 2645, 2651, 2659, 2663, 2668, 2672, 2675, - 2684, 2686, 2690, 2693, 2698, 2702, 2708, 2719, 2722, 2726, - 2730, 2738, 2743, 2749, 2752, 2754, 2756, 2762, 2764, 2773, - 2776, 2778, 2780, 2782, 2786, 2789, 2792, 2794, 2796, 2798, - 2802, 2805, 2816, 2826, 2828, 2829, 2833, 2841, 2843, 2851, - 2854, 2856, 2858, 2860, 2864, 2867, 2870, 2872, 2874, 2876, - 2880, 2883, 2886, 2888, 2890, 2892, 2894, 2901, 2905, 2910, - 2914, 2919, 2921, 2925, 2928, 2930, 2933, 2935, 2936, 2939, - 2941, 2943, 2949, 2960, 2966, 2972, 2986, 2988, 2992, 3006, - 3008, 3010, 3014, 3020, 3033, 3035, 3039, 3052, 3058, 3060, - 3061, 3062, 3070, 3075, 3084, 3085, 3089, 3092, 3098, 3104, - 3107, 3109, 3111, 3113, 3117, 3121, 3125, 3128, 3132, 3134, - 3143, 3146, 3148, 3150, 3152, 3154, 3156, 3158, 3160, 3164, - 3168, 3172, 3176, 3177, 3179, 3181, 3183, 3185, 3187, 3189, - 3191, 3193, 3201, 3203, 3204, 3205, 3208, 3214, 3216, 3221, - 3223, 3226, 3240, 3243, 3246, 3250, 3253, 3260, 3262, 3265, - 3267, 3269, 3272, 3275, 3278, 3281, 3283, 3286, 3290, 3292, - 3298, 3300, 3301, 3303, 3308, 3310, 3312, 3314, 3316, 3319, - 3320, 3322, 3325, 3326, 3329, 3329, 3332, 3332, 3335, 3335, - 3337, 3339, 3341, 3343, 3349, 3355, 3358, 3361, 3367, 3369, - 3371, 3375, 3377, 3378, 3379, 3381, 3384, 3391, 3396, 3402, - 3406, 3408, 3411, 3413, 3416, 3420, 3422, 3425, 3427, 3430, - 3447, 3453, 3461, 3463, 3465, 3469, 3472, 3473, 3481, 3485, - 3489, 3492, 3493, 3499, 3502, 3505, 3507, 3511, 3516, 3519, - 3529, 3534, 3535, 3542, 3545, 3548, 3550, 3553, 3555, 3565, - 3579, 3583, 3586, 3588, 3592, 3596, 3599, 3602, 3604, 3608, - 3610, 3617, 3624, 3627, 3631, 3635, 3639, 3645, 3649, 3654, - 3656, 3659, 3664, 3670, 3681, 3684, 3686, 3690, 3695, 3697, - 3704, 3707, 3709, 3711, 3717, 3722, 3725, 3727, 3729, 3731, - 3733, 3735, 3737, 3739, 3741, 3743, 3745, 3747, 3749, 3751, - 3753, 3755, 3757, 3759, 3761, 3763, 3765, 3767, 3769, 3771, - 3773, 3775, 3777, 3779, 3781, 3783, 3785, 3787, 3790, 3792 + 2161, 2166, 2190, 2192, 2195, 2197, 2202, 2204, 2206, 2208, + 2210, 2212, 2216, 2224, 2227, 2229, 2233, 2240, 2246, 2252, + 2258, 2268, 2274, 2278, 2285, 2313, 2323, 2329, 2332, 2335, + 2337, 2341, 2343, 2347, 2352, 2358, 2361, 2362, 2383, 2406, + 2408, 2412, 2423, 2437, 2438, 2439, 2440, 2443, 2458, 2463, + 2469, 2471, 2476, 2478, 2480, 2482, 2484, 2486, 2489, 2499, + 2506, 2531, 2537, 2540, 2543, 2545, 2556, 2561, 2564, 2569, + 2572, 2579, 2589, 2592, 2599, 2609, 2611, 2614, 2616, 2619, + 2626, 2634, 2641, 2647, 2653, 2661, 2665, 2670, 2674, 2677, + 2686, 2688, 2692, 2695, 2700, 2704, 2710, 2721, 2724, 2728, + 2732, 2740, 2745, 2751, 2754, 2756, 2758, 2764, 2766, 2775, + 2778, 2780, 2782, 2784, 2788, 2791, 2794, 2796, 2798, 2800, + 2804, 2807, 2818, 2828, 2830, 2831, 2835, 2843, 2845, 2853, + 2856, 2858, 2860, 2862, 2866, 2869, 2872, 2874, 2876, 2878, + 2882, 2885, 2888, 2890, 2892, 2894, 2896, 2903, 2907, 2912, + 2916, 2921, 2923, 2927, 2930, 2932, 2935, 2937, 2938, 2941, + 2943, 2945, 2951, 2962, 2968, 2974, 2988, 2990, 2994, 3008, + 3010, 3012, 3016, 3022, 3035, 3037, 3041, 3054, 3060, 3062, + 3063, 3064, 3072, 3077, 3086, 3087, 3091, 3094, 3100, 3106, + 3109, 3111, 3113, 3115, 3119, 3123, 3127, 3130, 3134, 3136, + 3145, 3148, 3150, 3152, 3154, 3156, 3158, 3160, 3162, 3166, + 3170, 3174, 3178, 3179, 3181, 3183, 3185, 3187, 3189, 3191, + 3193, 3195, 3203, 3205, 3206, 3207, 3210, 3216, 3218, 3223, + 3225, 3228, 3242, 3245, 3248, 3252, 3255, 3262, 3264, 3267, + 3269, 3271, 3274, 3277, 3280, 3283, 3285, 3288, 3292, 3294, + 3300, 3302, 3303, 3305, 3310, 3312, 3314, 3316, 3318, 3321, + 3322, 3324, 3327, 3328, 3331, 3331, 3334, 3334, 3337, 3337, + 3339, 3341, 3343, 3345, 3351, 3357, 3360, 3363, 3369, 3371, + 3373, 3377, 3379, 3380, 3381, 3383, 3386, 3393, 3398, 3404, + 3408, 3410, 3413, 3415, 3418, 3422, 3424, 3427, 3429, 3432, + 3449, 3455, 3463, 3465, 3467, 3471, 3474, 3475, 3483, 3487, + 3491, 3494, 3495, 3501, 3504, 3507, 3509, 3513, 3518, 3521, + 3531, 3536, 3537, 3544, 3547, 3550, 3552, 3555, 3557, 3567, + 3581, 3585, 3588, 3590, 3594, 3598, 3601, 3604, 3606, 3610, + 3612, 3619, 3626, 3629, 3633, 3637, 3641, 3647, 3651, 3656, + 3658, 3661, 3666, 3672, 3683, 3686, 3688, 3692, 3697, 3699, + 3706, 3709, 3711, 3713, 3719, 3724, 3727, 3729, 3731, 3733, + 3735, 3737, 3739, 3741, 3743, 3745, 3747, 3749, 3751, 3753, + 3755, 3757, 3759, 3761, 3763, 3765, 3767, 3769, 3771, 3773, + 3775, 3777, 3779, 3781, 3783, 3785, 3787, 3789, 3792, 3794 }; #endif @@ -6397,10 +6397,12 @@ case 481: case 482: #line 2167 "parse.y" { - if (yyvsp[0].ftype.new_type_flag) + if (yyvsp[0].ftype.new_type_flag && yyvsp[0].ftype.t != error_mark_node) pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (yyvsp[0].ftype.t))); yyval.ftype.new_type_flag = 0; - if (TYPE_BINFO (yyvsp[0].ftype.t) == NULL_TREE) + if (yyvsp[0].ftype.t == error_mark_node) + yyval.ftype.t = yyvsp[0].ftype.t; + else if (TYPE_BINFO (yyvsp[0].ftype.t) == NULL_TREE) { cp_error ("%T is not a class type", yyvsp[0].ftype.t); yyval.ftype.t = error_mark_node; @@ -6417,51 +6419,51 @@ case 482: ; break;} case 486: -#line 2196 "parse.y" +#line 2198 "parse.y" { if (pedantic && !in_system_header) pedwarn ("comma at end of enumerator list"); ; break;} case 488: -#line 2203 "parse.y" +#line 2205 "parse.y" { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} case 489: -#line 2205 "parse.y" +#line 2207 "parse.y" { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} case 490: -#line 2207 "parse.y" +#line 2209 "parse.y" { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} case 491: -#line 2209 "parse.y" +#line 2211 "parse.y" { error ("no body nor ';' separates two class, struct or union declarations"); ; break;} case 492: -#line 2211 "parse.y" +#line 2213 "parse.y" { yyval.ttype = build_decl_list (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 493: -#line 2216 "parse.y" +#line 2218 "parse.y" { current_aggr = yyvsp[-1].ttype; yyval.ttype = yyvsp[0].ttype; ; break;} case 494: -#line 2224 "parse.y" +#line 2226 "parse.y" { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} case 495: -#line 2226 "parse.y" +#line 2228 "parse.y" { yyungetc ('{', 1); ; break;} case 496: -#line 2228 "parse.y" +#line 2230 "parse.y" { yyungetc (':', 1); ; break;} case 497: -#line 2233 "parse.y" +#line 2235 "parse.y" { current_aggr = yyvsp[-2].ttype; yyval.ftype.t = handle_class_head (yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); @@ -6469,7 +6471,7 @@ case 497: ; break;} case 498: -#line 2239 "parse.y" +#line 2241 "parse.y" { current_aggr = yyvsp[-3].ttype; yyval.ftype.t = handle_class_head (yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); @@ -6477,7 +6479,7 @@ case 498: ; break;} case 499: -#line 2245 "parse.y" +#line 2247 "parse.y" { current_aggr = yyvsp[-2].ttype; yyval.ftype.t = handle_class_head (yyvsp[-2].ttype, NULL_TREE, yyvsp[0].ttype); @@ -6485,7 +6487,7 @@ case 499: ; break;} case 500: -#line 2251 "parse.y" +#line 2253 "parse.y" { current_aggr = yyvsp[-1].ttype; yyval.ftype.t = yyvsp[0].ttype; @@ -6493,7 +6495,7 @@ case 500: ; break;} case 501: -#line 2257 "parse.y" +#line 2259 "parse.y" { current_aggr = yyvsp[-2].ttype; yyval.ftype.t = yyvsp[0].ttype; @@ -6503,18 +6505,18 @@ case 501: ; break;} case 502: -#line 2268 "parse.y" +#line 2270 "parse.y" { yyval.ftype.t = xref_tag (current_aggr, yyvsp[0].ttype, 1); yyval.ftype.new_type_flag = 0; ; break;} case 503: -#line 2273 "parse.y" +#line 2275 "parse.y" { yyval.ttype = xref_tag (current_aggr, yyvsp[0].ttype, 0); ; break;} case 504: -#line 2277 "parse.y" +#line 2279 "parse.y" { yyval.ftype.t = yyvsp[-1].ttype; yyval.ftype.new_type_flag = 0; @@ -6523,7 +6525,7 @@ case 504: ; break;} case 505: -#line 2285 "parse.y" +#line 2287 "parse.y" { if (yyvsp[-1].ftype.t != error_mark_node) { @@ -6550,51 +6552,51 @@ case 505: ; break;} case 506: -#line 2313 "parse.y" +#line 2315 "parse.y" { yyval.ttype = xref_tag (yyval.ttype, make_anon_name (), 0); yyungetc ('{', 1); ; break;} case 507: -#line 2323 "parse.y" +#line 2325 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; break;} case 509: -#line 2332 "parse.y" +#line 2334 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 510: -#line 2334 "parse.y" +#line 2336 "parse.y" { yyungetc(':', 1); yyval.ttype = NULL_TREE; ; break;} case 511: -#line 2336 "parse.y" +#line 2338 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 513: -#line 2342 "parse.y" +#line 2344 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} case 514: -#line 2347 "parse.y" +#line 2349 "parse.y" { yyval.ttype = finish_base_specifier (access_default_node, yyvsp[0].ttype, current_aggr == signature_type_node); ; break;} case 515: -#line 2351 "parse.y" +#line 2353 "parse.y" { yyval.ttype = finish_base_specifier (yyvsp[-2].ttype, yyvsp[0].ttype, current_aggr == signature_type_node); ; break;} case 516: -#line 2358 "parse.y" +#line 2360 "parse.y" { if (yyval.ttype != error_mark_node) yyval.ttype = TYPE_MAIN_DECL (yyvsp[0].ttype); ; break;} case 518: -#line 2361 "parse.y" +#line 2363 "parse.y" { if (current_aggr == signature_type_node) { @@ -6617,7 +6619,7 @@ case 518: ; break;} case 519: -#line 2382 "parse.y" +#line 2384 "parse.y" { if (current_aggr == signature_type_node) { @@ -6640,13 +6642,13 @@ case 519: ; break;} case 521: -#line 2407 "parse.y" +#line 2409 "parse.y" { if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL]) cp_error ("`%D' access", yyvsp[-1].ttype); yyval.ttype = access_default_virtual_node; ; break;} case 522: -#line 2411 "parse.y" +#line 2413 "parse.y" { if (yyvsp[-2].ttype != access_default_virtual_node) error ("multiple access specifiers"); @@ -6659,7 +6661,7 @@ case 522: ; break;} case 523: -#line 2422 "parse.y" +#line 2424 "parse.y" { if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL]) cp_error ("`%D' access", yyvsp[-1].ttype); else if (yyval.ttype == access_public_node) @@ -6673,7 +6675,7 @@ case 523: ; break;} case 528: -#line 2443 "parse.y" +#line 2445 "parse.y" { if (current_aggr == signature_type_node) { @@ -6685,49 +6687,49 @@ case 528: ; break;} case 529: -#line 2458 "parse.y" +#line 2460 "parse.y" { finish_member_declaration (yyvsp[0].ttype); ; break;} case 530: -#line 2462 "parse.y" +#line 2464 "parse.y" { finish_member_declaration (yyvsp[0].ttype); ; break;} case 532: -#line 2470 "parse.y" +#line 2472 "parse.y" { error ("missing ';' before right brace"); yyungetc ('}', 0); ; break;} case 533: -#line 2475 "parse.y" +#line 2477 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} case 534: -#line 2477 "parse.y" +#line 2479 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} case 535: -#line 2479 "parse.y" +#line 2481 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} case 536: -#line 2481 "parse.y" +#line 2483 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} case 537: -#line 2483 "parse.y" +#line 2485 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 538: -#line 2485 "parse.y" +#line 2487 "parse.y" { yyval.ttype = yyvsp[0].ttype; pedantic = yyvsp[-1].itype; ; break;} case 539: -#line 2488 "parse.y" +#line 2490 "parse.y" { if (yyvsp[0].ttype) yyval.ttype = finish_member_template_decl (yyvsp[0].ttype); @@ -6739,14 +6741,14 @@ case 539: ; break;} case 540: -#line 2498 "parse.y" +#line 2500 "parse.y" { yyval.ttype = finish_member_class_template (yyvsp[-1].ftype.t); finish_template_decl (yyvsp[-2].ttype); ; break;} case 541: -#line 2509 "parse.y" +#line 2511 "parse.y" { /* Most of the productions for component_decl only allow the creation of one new member, so we call @@ -6769,7 +6771,7 @@ case 541: ; break;} case 542: -#line 2530 "parse.y" +#line 2532 "parse.y" { if (!yyvsp[0].itype) grok_x_components (yyvsp[-1].ttype); @@ -6777,45 +6779,45 @@ case 542: ; break;} case 543: -#line 2536 "parse.y" +#line 2538 "parse.y" { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; break;} case 544: -#line 2539 "parse.y" +#line 2541 "parse.y" { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; break;} case 545: -#line 2542 "parse.y" +#line 2544 "parse.y" { yyval.ttype = grokbitfield (NULL_TREE, NULL_TREE, yyvsp[0].ttype); ; break;} case 546: -#line 2544 "parse.y" +#line 2546 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 547: -#line 2555 "parse.y" +#line 2557 "parse.y" { tree specs, attrs; split_specs_attrs (yyvsp[-4].ttype, &specs, &attrs); yyval.ttype = grokfield (yyvsp[-3].ttype, specs, yyvsp[0].ttype, yyvsp[-2].ttype, build_tree_list (yyvsp[-1].ttype, attrs)); ; break;} case 548: -#line 2560 "parse.y" +#line 2562 "parse.y" { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; break;} case 549: -#line 2563 "parse.y" +#line 2565 "parse.y" { yyval.ttype = do_class_using_decl (yyvsp[0].ttype); ; break;} case 550: -#line 2569 "parse.y" +#line 2571 "parse.y" { yyval.itype = 0; ; break;} case 551: -#line 2571 "parse.y" +#line 2573 "parse.y" { if (PROCESSING_REAL_TEMPLATE_DECL_P ()) yyvsp[0].ttype = finish_member_template_decl (yyvsp[0].ttype); @@ -6824,7 +6826,7 @@ case 551: ; break;} case 552: -#line 2578 "parse.y" +#line 2580 "parse.y" { check_multiple_declarators (); if (PROCESSING_REAL_TEMPLATE_DECL_P ()) @@ -6834,11 +6836,11 @@ case 552: ; break;} case 553: -#line 2589 "parse.y" +#line 2591 "parse.y" { yyval.itype = 0; ; break;} case 554: -#line 2591 "parse.y" +#line 2593 "parse.y" { if (PROCESSING_REAL_TEMPLATE_DECL_P ()) yyvsp[0].ttype = finish_member_template_decl (yyvsp[0].ttype); @@ -6847,7 +6849,7 @@ case 554: ; break;} case 555: -#line 2598 "parse.y" +#line 2600 "parse.y" { check_multiple_declarators (); if (PROCESSING_REAL_TEMPLATE_DECL_P ()) @@ -6857,7 +6859,7 @@ case 555: ; break;} case 560: -#line 2619 "parse.y" +#line 2621 "parse.y" { split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, &prefix_attributes); yyvsp[-4].ttype = current_declspecs; @@ -6865,7 +6867,7 @@ case 560: build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; break;} case 561: -#line 2625 "parse.y" +#line 2627 "parse.y" { split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, &prefix_attributes); yyvsp[-4].ttype = current_declspecs; @@ -6873,7 +6875,7 @@ case 561: cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; break;} case 562: -#line 2634 "parse.y" +#line 2636 "parse.y" { split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, &prefix_attributes); yyvsp[-4].ttype = current_declspecs; @@ -6881,7 +6883,7 @@ case 562: build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; break;} case 563: -#line 2640 "parse.y" +#line 2642 "parse.y" { split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, &prefix_attributes); yyvsp[-4].ttype = current_declspecs; @@ -6889,7 +6891,7 @@ case 563: build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; break;} case 564: -#line 2646 "parse.y" +#line 2648 "parse.y" { split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, &prefix_attributes); yyvsp[-4].ttype = current_declspecs; @@ -6897,7 +6899,7 @@ case 564: cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; break;} case 565: -#line 2652 "parse.y" +#line 2654 "parse.y" { split_specs_attrs (yyvsp[-3].ttype, ¤t_declspecs, &prefix_attributes); yyvsp[-3].ttype = current_declspecs; @@ -6905,54 +6907,54 @@ case 565: cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; break;} case 566: -#line 2661 "parse.y" +#line 2663 "parse.y" { yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[0].ttype, yyvsp[-2].ttype, build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; break;} case 567: -#line 2664 "parse.y" +#line 2666 "parse.y" { yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; break;} case 568: -#line 2670 "parse.y" +#line 2672 "parse.y" { yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[0].ttype, yyvsp[-2].ttype, build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; break;} case 569: -#line 2673 "parse.y" +#line 2675 "parse.y" { yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; break;} case 570: -#line 2676 "parse.y" +#line 2678 "parse.y" { yyval.ttype = grokbitfield (NULL_TREE, current_declspecs, yyvsp[-1].ttype); cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; break;} case 572: -#line 2687 "parse.y" +#line 2689 "parse.y" { TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} case 573: -#line 2692 "parse.y" +#line 2694 "parse.y" { yyval.ttype = build_enumerator (yyval.ttype, NULL_TREE, current_enum_type); ; break;} case 574: -#line 2694 "parse.y" +#line 2696 "parse.y" { yyval.ttype = build_enumerator (yyval.ttype, yyvsp[0].ttype, current_enum_type); ; break;} case 575: -#line 2700 "parse.y" +#line 2702 "parse.y" { yyval.ftype.t = build_decl_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} case 576: -#line 2703 "parse.y" +#line 2705 "parse.y" { yyval.ftype.t = build_decl_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} case 577: -#line 2710 "parse.y" +#line 2712 "parse.y" { if (pedantic) pedwarn ("ANSI C++ forbids array dimensions with parenthesized type in new"); @@ -6962,49 +6964,49 @@ case 577: ; break;} case 578: -#line 2721 "parse.y" +#line 2723 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 579: -#line 2723 "parse.y" +#line 2725 "parse.y" { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} case 580: -#line 2728 "parse.y" +#line 2730 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); yyval.ftype.new_type_flag = 0; ; break;} case 581: -#line 2731 "parse.y" +#line 2733 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} case 582: -#line 2740 "parse.y" +#line 2742 "parse.y" { yyval.itype = suspend_momentary (); ; break;} case 583: -#line 2745 "parse.y" +#line 2747 "parse.y" { resume_momentary ((int) yyvsp[-1].itype); yyval.ttype = yyvsp[0].ttype; ; break;} case 584: -#line 2751 "parse.y" +#line 2753 "parse.y" { resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = yyvsp[-1].ttype; ; break;} case 585: -#line 2753 "parse.y" +#line 2755 "parse.y" { resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = yyvsp[-1].ttype; ; break;} case 586: -#line 2755 "parse.y" +#line 2757 "parse.y" { resume_momentary ((int) yyvsp[-1].itype); yyval.ttype = empty_parms (); ; break;} case 587: -#line 2757 "parse.y" +#line 2759 "parse.y" { resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = NULL_TREE; ; break;} case 589: -#line 2765 "parse.y" +#line 2767 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ @@ -7012,51 +7014,51 @@ case 589: ; break;} case 590: -#line 2775 "parse.y" +#line 2777 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 591: -#line 2777 "parse.y" +#line 2779 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 592: -#line 2779 "parse.y" +#line 2781 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 593: -#line 2781 "parse.y" +#line 2783 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 594: -#line 2783 "parse.y" +#line 2785 "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 596: -#line 2791 "parse.y" +#line 2793 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 597: -#line 2793 "parse.y" +#line 2795 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} case 598: -#line 2795 "parse.y" +#line 2797 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} case 599: -#line 2797 "parse.y" +#line 2799 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} case 600: -#line 2799 "parse.y" +#line 2801 "parse.y" { push_nested_class (yyvsp[-1].ttype, 3); yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); TREE_COMPLEXITY (yyval.ttype) = current_class_depth; ; break;} case 602: -#line 2807 "parse.y" +#line 2809 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) { @@ -7068,7 +7070,7 @@ case 602: ; break;} case 603: -#line 2817 "parse.y" +#line 2819 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); @@ -7078,15 +7080,15 @@ case 603: ; break;} case 606: -#line 2830 "parse.y" +#line 2832 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 607: -#line 2835 "parse.y" +#line 2837 "parse.y" { yyval.ttype = get_type_decl (yyvsp[0].ttype); ; break;} case 609: -#line 2844 "parse.y" +#line 2846 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ @@ -7094,122 +7096,122 @@ case 609: ; break;} case 610: -#line 2853 "parse.y" +#line 2855 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 611: -#line 2855 "parse.y" +#line 2857 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 612: -#line 2857 "parse.y" +#line 2859 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 613: -#line 2859 "parse.y" +#line 2861 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 614: -#line 2861 "parse.y" +#line 2863 "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 616: -#line 2869 "parse.y" +#line 2871 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 617: -#line 2871 "parse.y" +#line 2873 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 618: -#line 2873 "parse.y" +#line 2875 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 619: -#line 2875 "parse.y" +#line 2877 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 620: -#line 2877 "parse.y" +#line 2879 "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 622: -#line 2885 "parse.y" +#line 2887 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 623: -#line 2887 "parse.y" +#line 2889 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} case 624: -#line 2889 "parse.y" +#line 2891 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} case 625: -#line 2891 "parse.y" +#line 2893 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} case 626: -#line 2893 "parse.y" +#line 2895 "parse.y" { enter_scope_of (yyvsp[0].ttype); ; break;} case 627: -#line 2895 "parse.y" +#line 2897 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); enter_scope_of (yyval.ttype); ; break;} case 628: -#line 2903 "parse.y" +#line 2905 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} case 629: -#line 2906 "parse.y" +#line 2908 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 630: -#line 2912 "parse.y" +#line 2914 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} case 631: -#line 2915 "parse.y" +#line 2917 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 633: -#line 2922 "parse.y" +#line 2924 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 634: -#line 2927 "parse.y" +#line 2929 "parse.y" { yyval.ttype = build_functional_cast (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; break;} case 635: -#line 2929 "parse.y" +#line 2931 "parse.y" { yyval.ttype = reparse_decl_as_expr (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; break;} case 636: -#line 2931 "parse.y" +#line 2933 "parse.y" { yyval.ttype = reparse_absdcl_as_expr (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 641: -#line 2942 "parse.y" +#line 2944 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 642: -#line 2944 "parse.y" +#line 2946 "parse.y" { got_scope = yyval.ttype = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} case 643: -#line 2951 "parse.y" +#line 2953 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) { @@ -7221,7 +7223,7 @@ case 643: ; break;} case 644: -#line 2961 "parse.y" +#line 2963 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7229,7 +7231,7 @@ case 644: ; break;} case 645: -#line 2967 "parse.y" +#line 2969 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7237,15 +7239,15 @@ case 645: ; break;} case 646: -#line 2973 "parse.y" +#line 2975 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyvsp[-1].ttype)); ; break;} case 648: -#line 2989 "parse.y" +#line 2991 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 649: -#line 2994 "parse.y" +#line 2996 "parse.y" { if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)) == 't') yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); @@ -7260,26 +7262,26 @@ case 649: ; break;} case 650: -#line 3007 "parse.y" +#line 3009 "parse.y" { yyval.ttype = TREE_TYPE (yyvsp[0].ttype); ; break;} case 651: -#line 3009 "parse.y" +#line 3011 "parse.y" { yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 652: -#line 3011 "parse.y" +#line 3013 "parse.y" { yyval.ttype = make_typename_type (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} case 653: -#line 3016 "parse.y" +#line 3018 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) cp_error ("`%T' is not a class or namespace", yyvsp[0].ttype); ; break;} case 654: -#line 3021 "parse.y" +#line 3023 "parse.y" { if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)) == 't') yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); @@ -7294,15 +7296,15 @@ case 654: ; break;} case 655: -#line 3034 "parse.y" +#line 3036 "parse.y" { got_scope = yyval.ttype = make_typename_type (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 656: -#line 3036 "parse.y" +#line 3038 "parse.y" { got_scope = yyval.ttype = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} case 657: -#line 3041 "parse.y" +#line 3043 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE) yyvsp[-1].ttype = lastiddecl; @@ -7316,7 +7318,7 @@ case 657: ; break;} case 658: -#line 3053 "parse.y" +#line 3055 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7324,11 +7326,11 @@ case 658: ; break;} case 659: -#line 3059 "parse.y" +#line 3061 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyval.ttype)); ; break;} case 662: -#line 3063 "parse.y" +#line 3065 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7336,11 +7338,11 @@ case 662: ; break;} case 663: -#line 3072 "parse.y" +#line 3074 "parse.y" { yyval.ttype = build_min_nt (TEMPLATE_ID_EXPR, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} case 664: -#line 3077 "parse.y" +#line 3079 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); @@ -7350,59 +7352,59 @@ case 664: ; break;} case 666: -#line 3086 "parse.y" +#line 3088 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 667: -#line 3091 "parse.y" +#line 3093 "parse.y" { got_scope = NULL_TREE; ; break;} case 668: -#line 3093 "parse.y" +#line 3095 "parse.y" { yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ; break;} case 669: -#line 3100 "parse.y" +#line 3102 "parse.y" { got_scope = void_type_node; ; break;} case 670: -#line 3106 "parse.y" +#line 3108 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 671: -#line 3108 "parse.y" +#line 3110 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} case 672: -#line 3110 "parse.y" +#line 3112 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 673: -#line 3112 "parse.y" +#line 3114 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} case 674: -#line 3114 "parse.y" +#line 3116 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} case 675: -#line 3118 "parse.y" +#line 3120 "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 677: -#line 3127 "parse.y" +#line 3129 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} case 678: -#line 3129 "parse.y" +#line 3131 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} case 680: -#line 3135 "parse.y" +#line 3137 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ @@ -7410,96 +7412,96 @@ case 680: ; break;} case 681: -#line 3145 "parse.y" +#line 3147 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 682: -#line 3147 "parse.y" +#line 3149 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 683: -#line 3149 "parse.y" +#line 3151 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} case 684: -#line 3151 "parse.y" +#line 3153 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ; break;} case 685: -#line 3153 "parse.y" +#line 3155 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 686: -#line 3155 "parse.y" +#line 3157 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 687: -#line 3157 "parse.y" +#line 3159 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} case 688: -#line 3159 "parse.y" +#line 3161 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ; break;} case 689: -#line 3161 "parse.y" +#line 3163 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} case 690: -#line 3165 "parse.y" +#line 3167 "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 692: -#line 3174 "parse.y" +#line 3176 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} case 694: -#line 3178 "parse.y" +#line 3180 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 695: -#line 3180 "parse.y" +#line 3182 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 696: -#line 3182 "parse.y" +#line 3184 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} case 697: -#line 3184 "parse.y" +#line 3186 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} case 698: -#line 3186 "parse.y" +#line 3188 "parse.y" { yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 699: -#line 3188 "parse.y" +#line 3190 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 700: -#line 3190 "parse.y" +#line 3192 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 701: -#line 3192 "parse.y" +#line 3194 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} case 702: -#line 3194 "parse.y" +#line 3196 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); ; break;} case 709: -#line 3217 "parse.y" +#line 3219 "parse.y" { if (pedantic) pedwarn ("ANSI C++ forbids label declarations"); ; break;} case 712: -#line 3228 "parse.y" +#line 3230 "parse.y" { tree link; for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link)) { @@ -7510,181 +7512,181 @@ case 712: ; break;} case 713: -#line 3242 "parse.y" +#line 3244 "parse.y" {; break;} case 715: -#line 3248 "parse.y" +#line 3250 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} case 716: -#line 3250 "parse.y" +#line 3252 "parse.y" { yyval.ttype = finish_compound_stmt (0, yyvsp[-1].ttype); ; break;} case 717: -#line 3255 "parse.y" +#line 3257 "parse.y" { yyval.ttype = begin_if_stmt (); cond_stmt_keyword = "if"; ; break;} case 718: -#line 3260 "parse.y" +#line 3262 "parse.y" { finish_if_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 719: -#line 3262 "parse.y" +#line 3264 "parse.y" { yyval.ttype = finish_then_clause (yyvsp[-3].ttype); ; break;} case 721: -#line 3267 "parse.y" +#line 3269 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} case 722: -#line 3269 "parse.y" +#line 3271 "parse.y" { yyval.ttype = finish_compound_stmt (0, yyvsp[-1].ttype); ; break;} case 723: -#line 3274 "parse.y" +#line 3276 "parse.y" {; break;} case 725: -#line 3280 "parse.y" +#line 3282 "parse.y" { finish_stmt (); ; break;} case 726: -#line 3282 "parse.y" +#line 3284 "parse.y" { finish_expr_stmt (yyvsp[-1].ttype); ; break;} case 727: -#line 3284 "parse.y" +#line 3286 "parse.y" { begin_else_clause (); ; break;} case 728: -#line 3286 "parse.y" +#line 3288 "parse.y" { finish_else_clause (yyvsp[-3].ttype); finish_if_stmt (); ; break;} case 729: -#line 3291 "parse.y" +#line 3293 "parse.y" { finish_if_stmt (); ; break;} case 730: -#line 3293 "parse.y" +#line 3295 "parse.y" { yyval.ttype = begin_while_stmt (); cond_stmt_keyword = "while"; ; break;} case 731: -#line 3298 "parse.y" +#line 3300 "parse.y" { finish_while_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 732: -#line 3300 "parse.y" +#line 3302 "parse.y" { finish_while_stmt (yyvsp[-3].ttype); ; break;} case 733: -#line 3302 "parse.y" +#line 3304 "parse.y" { yyval.ttype = begin_do_stmt (); ; break;} case 734: -#line 3304 "parse.y" +#line 3306 "parse.y" { finish_do_body (yyvsp[-2].ttype); cond_stmt_keyword = "do"; ; break;} case 735: -#line 3309 "parse.y" +#line 3311 "parse.y" { finish_do_stmt (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} case 736: -#line 3311 "parse.y" +#line 3313 "parse.y" { yyval.ttype = begin_for_stmt (); ; break;} case 737: -#line 3313 "parse.y" +#line 3315 "parse.y" { finish_for_init_stmt (yyvsp[-2].ttype); ; break;} case 738: -#line 3315 "parse.y" +#line 3317 "parse.y" { finish_for_cond (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} case 739: -#line 3317 "parse.y" +#line 3319 "parse.y" { finish_for_expr (yyvsp[-1].ttype, yyvsp[-8].ttype); ; break;} case 740: -#line 3319 "parse.y" +#line 3321 "parse.y" { finish_for_stmt (yyvsp[-3].ttype, yyvsp[-10].ttype); ; break;} case 741: -#line 3321 "parse.y" +#line 3323 "parse.y" { begin_switch_stmt (); ; break;} case 742: -#line 3323 "parse.y" +#line 3325 "parse.y" { yyval.ttype = finish_switch_cond (yyvsp[-1].ttype); ; break;} case 743: -#line 3325 "parse.y" +#line 3327 "parse.y" { finish_switch_stmt (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} case 744: -#line 3327 "parse.y" +#line 3329 "parse.y" { finish_case_label (yyvsp[-1].ttype, NULL_TREE); ; break;} case 746: -#line 3330 "parse.y" +#line 3332 "parse.y" { finish_case_label (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} case 748: -#line 3333 "parse.y" +#line 3335 "parse.y" { finish_case_label (NULL_TREE, NULL_TREE); ; break;} case 750: -#line 3336 "parse.y" +#line 3338 "parse.y" { finish_break_stmt (); ; break;} case 751: -#line 3338 "parse.y" +#line 3340 "parse.y" { finish_continue_stmt (); ; break;} case 752: -#line 3340 "parse.y" +#line 3342 "parse.y" { finish_return_stmt (NULL_TREE); ; break;} case 753: -#line 3342 "parse.y" +#line 3344 "parse.y" { finish_return_stmt (yyvsp[-1].ttype); ; break;} case 754: -#line 3344 "parse.y" +#line 3346 "parse.y" { finish_asm_stmt (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, NULL_TREE); ; break;} case 755: -#line 3350 "parse.y" +#line 3352 "parse.y" { finish_asm_stmt (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE); ; break;} case 756: -#line 3356 "parse.y" +#line 3358 "parse.y" { finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} case 757: -#line 3360 "parse.y" +#line 3362 "parse.y" { finish_asm_stmt (yyvsp[-10].ttype, yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype); ; break;} case 758: -#line 3362 "parse.y" +#line 3364 "parse.y" { if (pedantic) pedwarn ("ANSI C++ forbids computed gotos"); @@ -7692,29 +7694,29 @@ case 758: ; break;} case 759: -#line 3368 "parse.y" +#line 3370 "parse.y" { finish_goto_stmt (yyvsp[-1].ttype); ; break;} case 760: -#line 3370 "parse.y" +#line 3372 "parse.y" { finish_stmt (); ; break;} case 761: -#line 3372 "parse.y" +#line 3374 "parse.y" { error ("label must be followed by statement"); yyungetc ('}', 0); finish_stmt (); ; break;} case 762: -#line 3376 "parse.y" +#line 3378 "parse.y" { finish_stmt (); ; break;} case 765: -#line 3380 "parse.y" +#line 3382 "parse.y" { do_local_using_decl (yyvsp[0].ttype); ; break;} case 767: -#line 3386 "parse.y" +#line 3388 "parse.y" { if (! current_function_parms_stored) store_parm_decls (); @@ -7722,54 +7724,54 @@ case 767: ; break;} case 768: -#line 3392 "parse.y" +#line 3394 "parse.y" { expand_start_all_catch (); ; break;} case 769: -#line 3396 "parse.y" +#line 3398 "parse.y" { expand_end_all_catch (); yyval.itype = yyvsp[-3].itype; ; break;} case 770: -#line 3404 "parse.y" +#line 3406 "parse.y" { yyval.ttype = begin_try_block (); ; break;} case 771: -#line 3406 "parse.y" +#line 3408 "parse.y" { finish_try_block (yyvsp[-1].ttype); ; break;} case 772: -#line 3408 "parse.y" +#line 3410 "parse.y" { finish_handler_sequence (yyvsp[-3].ttype); ; break;} case 775: -#line 3418 "parse.y" +#line 3420 "parse.y" { yyval.ttype = begin_handler(); ; break;} case 776: -#line 3420 "parse.y" +#line 3422 "parse.y" { finish_handler_parms (yyvsp[-1].ttype); ; break;} case 777: -#line 3422 "parse.y" +#line 3424 "parse.y" { finish_handler (yyvsp[-3].ttype); ; break;} case 780: -#line 3432 "parse.y" +#line 3434 "parse.y" { expand_start_catch_block (NULL_TREE, NULL_TREE); ; break;} case 781: -#line 3448 "parse.y" +#line 3450 "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 782: -#line 3455 "parse.y" +#line 3457 "parse.y" { tree label; do_label: label = define_label (input_filename, lineno, yyvsp[-1].ttype); @@ -7778,98 +7780,98 @@ case 782: ; break;} case 783: -#line 3462 "parse.y" +#line 3464 "parse.y" { goto do_label; ; break;} case 784: -#line 3464 "parse.y" +#line 3466 "parse.y" { goto do_label; ; break;} case 785: -#line 3466 "parse.y" +#line 3468 "parse.y" { goto do_label; ; break;} case 786: -#line 3471 "parse.y" +#line 3473 "parse.y" { if (yyvsp[-1].ttype) cplus_expand_expr_stmt (yyvsp[-1].ttype); ; break;} case 788: -#line 3474 "parse.y" +#line 3476 "parse.y" { if (pedantic) pedwarn ("ANSI C++ forbids compound statements inside for initializations"); ; break;} case 789: -#line 3483 "parse.y" +#line 3485 "parse.y" { emit_line_note (input_filename, lineno); yyval.ttype = NULL_TREE; ; break;} case 790: -#line 3486 "parse.y" +#line 3488 "parse.y" { emit_line_note (input_filename, lineno); ; break;} case 791: -#line 3491 "parse.y" +#line 3493 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 793: -#line 3494 "parse.y" +#line 3496 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 794: -#line 3501 "parse.y" +#line 3503 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 797: -#line 3508 "parse.y" +#line 3510 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} case 798: -#line 3513 "parse.y" +#line 3515 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ; break;} case 799: -#line 3518 "parse.y" +#line 3520 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, NULL_TREE); ; break;} case 800: -#line 3520 "parse.y" +#line 3522 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} case 801: -#line 3531 "parse.y" +#line 3533 "parse.y" { yyval.ttype = empty_parms(); ; break;} case 803: -#line 3536 "parse.y" +#line 3538 "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 804: -#line 3544 "parse.y" +#line 3546 "parse.y" { yyval.ttype = finish_parmlist (yyval.ttype, 0); ; break;} case 805: -#line 3546 "parse.y" +#line 3548 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} case 806: -#line 3549 "parse.y" +#line 3551 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} case 807: -#line 3551 "parse.y" +#line 3553 "parse.y" { yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 1); ; break;} case 808: -#line 3554 "parse.y" +#line 3556 "parse.y" { yyval.ttype = finish_parmlist (NULL_TREE, 1); ; break;} case 809: -#line 3556 "parse.y" +#line 3558 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right @@ -7881,7 +7883,7 @@ case 809: ; break;} case 810: -#line 3566 "parse.y" +#line 3568 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right @@ -7894,99 +7896,99 @@ case 810: ; break;} case 811: -#line 3581 "parse.y" +#line 3583 "parse.y" { maybe_snarf_defarg (); ; break;} case 812: -#line 3583 "parse.y" +#line 3585 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 815: -#line 3594 "parse.y" +#line 3596 "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 816: -#line 3597 "parse.y" +#line 3599 "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 817: -#line 3600 "parse.y" +#line 3602 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[0].ftype); yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ; break;} case 818: -#line 3603 "parse.y" +#line 3605 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} case 819: -#line 3605 "parse.y" +#line 3607 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ; break;} case 821: -#line 3611 "parse.y" +#line 3613 "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 822: -#line 3621 "parse.y" +#line 3623 "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 823: -#line 3625 "parse.y" +#line 3627 "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 824: -#line 3628 "parse.y" +#line 3630 "parse.y" { yyval.ftype.t = build_tree_list (build_decl_list (NULL_TREE, yyvsp[-1].ftype.t), yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} case 825: -#line 3632 "parse.y" +#line 3634 "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 826: -#line 3636 "parse.y" +#line 3638 "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 827: -#line 3640 "parse.y" +#line 3642 "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 828: -#line 3647 "parse.y" +#line 3649 "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 829: -#line 3650 "parse.y" +#line 3652 "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 832: -#line 3661 "parse.y" +#line 3663 "parse.y" { see_typename (); ; break;} case 833: -#line 3666 "parse.y" +#line 3668 "parse.y" { error ("type specifier omitted for parameter"); yyval.ttype = build_tree_list (integer_type_node, NULL_TREE); ; break;} case 834: -#line 3671 "parse.y" +#line 3673 "parse.y" { error ("type specifier omitted for parameter"); if (TREE_CODE (yyval.ttype) == SCOPE_REF @@ -7997,188 +7999,188 @@ case 834: ; break;} case 835: -#line 3683 "parse.y" +#line 3685 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 836: -#line 3685 "parse.y" +#line 3687 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} case 837: -#line 3687 "parse.y" +#line 3689 "parse.y" { yyval.ttype = build_decl_list (NULL_TREE, NULL_TREE); ; break;} case 838: -#line 3692 "parse.y" +#line 3694 "parse.y" { yyval.ttype = build_decl_list (NULL_TREE, groktypename(yyvsp[0].ftype.t)); ; break;} case 840: -#line 3698 "parse.y" +#line 3700 "parse.y" { TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} case 841: -#line 3706 "parse.y" +#line 3708 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 842: -#line 3708 "parse.y" +#line 3710 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 843: -#line 3710 "parse.y" +#line 3712 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 844: -#line 3712 "parse.y" +#line 3714 "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 845: -#line 3719 "parse.y" +#line 3721 "parse.y" { got_scope = NULL_TREE; ; break;} case 846: -#line 3724 "parse.y" +#line 3726 "parse.y" { yyval.ttype = ansi_opname[MULT_EXPR]; ; break;} case 847: -#line 3726 "parse.y" +#line 3728 "parse.y" { yyval.ttype = ansi_opname[TRUNC_DIV_EXPR]; ; break;} case 848: -#line 3728 "parse.y" +#line 3730 "parse.y" { yyval.ttype = ansi_opname[TRUNC_MOD_EXPR]; ; break;} case 849: -#line 3730 "parse.y" +#line 3732 "parse.y" { yyval.ttype = ansi_opname[PLUS_EXPR]; ; break;} case 850: -#line 3732 "parse.y" +#line 3734 "parse.y" { yyval.ttype = ansi_opname[MINUS_EXPR]; ; break;} case 851: -#line 3734 "parse.y" +#line 3736 "parse.y" { yyval.ttype = ansi_opname[BIT_AND_EXPR]; ; break;} case 852: -#line 3736 "parse.y" +#line 3738 "parse.y" { yyval.ttype = ansi_opname[BIT_IOR_EXPR]; ; break;} case 853: -#line 3738 "parse.y" +#line 3740 "parse.y" { yyval.ttype = ansi_opname[BIT_XOR_EXPR]; ; break;} case 854: -#line 3740 "parse.y" +#line 3742 "parse.y" { yyval.ttype = ansi_opname[BIT_NOT_EXPR]; ; break;} case 855: -#line 3742 "parse.y" +#line 3744 "parse.y" { yyval.ttype = ansi_opname[COMPOUND_EXPR]; ; break;} case 856: -#line 3744 "parse.y" +#line 3746 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 857: -#line 3746 "parse.y" +#line 3748 "parse.y" { yyval.ttype = ansi_opname[LT_EXPR]; ; break;} case 858: -#line 3748 "parse.y" +#line 3750 "parse.y" { yyval.ttype = ansi_opname[GT_EXPR]; ; break;} case 859: -#line 3750 "parse.y" +#line 3752 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 860: -#line 3752 "parse.y" +#line 3754 "parse.y" { yyval.ttype = ansi_assopname[yyvsp[0].code]; ; break;} case 861: -#line 3754 "parse.y" +#line 3756 "parse.y" { yyval.ttype = ansi_opname [MODIFY_EXPR]; ; break;} case 862: -#line 3756 "parse.y" +#line 3758 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 863: -#line 3758 "parse.y" +#line 3760 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 864: -#line 3760 "parse.y" +#line 3762 "parse.y" { yyval.ttype = ansi_opname[POSTINCREMENT_EXPR]; ; break;} case 865: -#line 3762 "parse.y" +#line 3764 "parse.y" { yyval.ttype = ansi_opname[PREDECREMENT_EXPR]; ; break;} case 866: -#line 3764 "parse.y" +#line 3766 "parse.y" { yyval.ttype = ansi_opname[TRUTH_ANDIF_EXPR]; ; break;} case 867: -#line 3766 "parse.y" +#line 3768 "parse.y" { yyval.ttype = ansi_opname[TRUTH_ORIF_EXPR]; ; break;} case 868: -#line 3768 "parse.y" +#line 3770 "parse.y" { yyval.ttype = ansi_opname[TRUTH_NOT_EXPR]; ; break;} case 869: -#line 3770 "parse.y" +#line 3772 "parse.y" { yyval.ttype = ansi_opname[COND_EXPR]; ; break;} case 870: -#line 3772 "parse.y" +#line 3774 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 871: -#line 3774 "parse.y" +#line 3776 "parse.y" { yyval.ttype = ansi_opname[COMPONENT_REF]; ; break;} case 872: -#line 3776 "parse.y" +#line 3778 "parse.y" { yyval.ttype = ansi_opname[MEMBER_REF]; ; break;} case 873: -#line 3778 "parse.y" +#line 3780 "parse.y" { yyval.ttype = ansi_opname[CALL_EXPR]; ; break;} case 874: -#line 3780 "parse.y" +#line 3782 "parse.y" { yyval.ttype = ansi_opname[ARRAY_REF]; ; break;} case 875: -#line 3782 "parse.y" +#line 3784 "parse.y" { yyval.ttype = ansi_opname[NEW_EXPR]; ; break;} case 876: -#line 3784 "parse.y" +#line 3786 "parse.y" { yyval.ttype = ansi_opname[DELETE_EXPR]; ; break;} case 877: -#line 3786 "parse.y" +#line 3788 "parse.y" { yyval.ttype = ansi_opname[VEC_NEW_EXPR]; ; break;} case 878: -#line 3788 "parse.y" +#line 3790 "parse.y" { yyval.ttype = ansi_opname[VEC_DELETE_EXPR]; ; break;} case 879: -#line 3791 "parse.y" +#line 3793 "parse.y" { yyval.ttype = grokoptypename (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 880: -#line 3793 "parse.y" +#line 3795 "parse.y" { yyval.ttype = ansi_opname[ERROR_MARK]; ; break;} } @@ -8379,7 +8381,7 @@ yyerrhandle: yystate = yyn; goto yynewstate; } -#line 3796 "parse.y" +#line 3798 "parse.y" #ifdef SPEW_DEBUG diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index 677730ca336..9201ad02090 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -2165,10 +2165,12 @@ structsp: } | class_head %prec EMPTY { - if ($1.new_type_flag) + if ($1.new_type_flag && $1.t != error_mark_node) pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL ($1.t))); $$.new_type_flag = 0; - if (TYPE_BINFO ($1.t) == NULL_TREE) + if ($1.t == error_mark_node) + $$.t = $1.t; + else if (TYPE_BINFO ($1.t) == NULL_TREE) { cp_error ("%T is not a class type", $1.t); $$.t = error_mark_node; diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash43.C b/gcc/testsuite/g++.old-deja/g++.pt/crash43.C new file mode 100644 index 00000000000..e324491e4b1 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash43.C @@ -0,0 +1,24 @@ +// Build don't link: +// Origin: Mark Mitchell + +template +struct S { + struct X {}; + struct Y {}; + + template + friend struct S::X; // ERROR - typename as friend + + template + friend typename S::Y; // ERROR - typename as friend +}; + +struct T { + template + friend struct S::X; // ERROR - typename as friend +}; + +struct U { + template + friend typename S::X; // ERROR - typename as friend +}; -- 2.30.2