From 97dbca2f7c40e761b965b41a6dca852183b8ce2e Mon Sep 17 00:00:00 2001 From: mmitchel Date: Fri, 29 Oct 1999 09:35:38 +0000 Subject: [PATCH] * cp-tree.h (make_typename_type): Change prototype. * decl.c (make_typename_type): Only complain if so requested. * parse.y (nested_name_specifier): Adjust calls. (typename_sub0): Likewise. (typename_sub1): Likewise. * parse.c: Regenerated. * pt.c (convert_template_argument): Pass complain to make_typename_type. (tsubst): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30254 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 12 + gcc/cp/cp-tree.h | 2 +- gcc/cp/decl.c | 23 +- gcc/cp/parse.c | 463 +++++++++++++------------ gcc/cp/parse.y | 17 +- gcc/cp/pt.c | 5 +- gcc/testsuite/g++.old-deja/g++.pt/typename24.C | 26 ++ 7 files changed, 301 insertions(+), 247 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/typename24.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 38e90b2f3e7..cee60ef10bd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +1999-10-29 Mark Mitchell + + * cp-tree.h (make_typename_type): Change prototype. + * decl.c (make_typename_type): Only complain if so requested. + * parse.y (nested_name_specifier): Adjust calls. + (typename_sub0): Likewise. + (typename_sub1): Likewise. + * parse.c: Regenerated. + * pt.c (convert_template_argument): Pass complain to + make_typename_type. + (tsubst): Likewise. + 1999-10-28 Mark Mitchell * semantics.c (finish_handler): End the scope of the handler diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 7d712dcbf88..529fce46a20 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3403,7 +3403,7 @@ extern tree namespace_binding PROTO((tree, tree)); extern void set_namespace_binding PROTO((tree, tree, tree)); extern tree lookup_namespace_name PROTO((tree, tree)); extern tree build_typename_type PROTO((tree, tree, tree, tree)); -extern tree make_typename_type PROTO((tree, tree)); +extern tree make_typename_type PROTO((tree, tree, int)); extern tree lookup_name_nonclass PROTO((tree)); extern tree lookup_function_nonclass PROTO((tree, tree)); extern tree lookup_name PROTO((tree, int)); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 72818cb69a2..00b52e44903 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5277,9 +5277,14 @@ build_typename_type (context, name, fullname, base_type) return t; } +/* Resolve `typename CONTEXT::NAME'. Returns an appropriate type, + unless an error occurs, in which case error_mark_node is returned. + If COMPLAIN zero, don't complain about any errors that occur. */ + tree -make_typename_type (context, name) +make_typename_type (context, name, complain) tree context, name; + int complain; { tree fullname; @@ -5313,8 +5318,9 @@ make_typename_type (context, name) { /* We can get here from typename_sub0 in the explicit_template_type expansion. Just fail. */ - cp_error ("no class template named `%#T' in `%#T'", - name, context); + if (complain) + cp_error ("no class template named `%#T' in `%#T'", + name, context); return error_mark_node; } @@ -5328,8 +5334,9 @@ make_typename_type (context, name) tmpl = lookup_field (context, name, 0, 0); if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) { - cp_error ("no class template named `%#T' in `%#T'", - name, context); + if (complain) + cp_error ("no class template named `%#T' in `%#T'", + name, context); return error_mark_node; } @@ -5344,7 +5351,8 @@ make_typename_type (context, name) if (!IS_AGGR_TYPE (context)) { - cp_error ("no type named `%#T' in `%#T'", name, context); + if (complain) + cp_error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } @@ -5358,7 +5366,8 @@ make_typename_type (context, name) there now or its never going to be. */ if (!uses_template_parms (context)) { - cp_error ("no type named `%#T' in `%#T'", name, context); + if (complain) + cp_error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } diff --git a/gcc/cp/parse.c b/gcc/cp/parse.c index 2076c384257..4ceeea6e538 100644 --- a/gcc/cp/parse.c +++ b/gcc/cp/parse.c @@ -721,30 +721,30 @@ static const short yyrline[] = { 0, 2800, 2802, 2804, 2806, 2810, 2813, 2816, 2818, 2820, 2822, 2826, 2829, 2832, 2834, 2836, 2838, 2840, 2847, 2851, 2856, 2860, 2865, 2867, 2871, 2874, 2876, 2879, 2881, 2882, 2885, - 2887, 2889, 2895, 2906, 2912, 2918, 2932, 2934, 2938, 2952, - 2954, 2956, 2960, 2966, 2979, 2981, 2985, 2998, 3004, 3006, - 3007, 3008, 3016, 3021, 3030, 3031, 3035, 3038, 3044, 3050, - 3053, 3055, 3057, 3059, 3063, 3067, 3071, 3074, 3078, 3080, - 3089, 3092, 3094, 3096, 3098, 3100, 3102, 3104, 3106, 3110, - 3114, 3118, 3122, 3124, 3126, 3128, 3130, 3132, 3134, 3136, - 3138, 3146, 3148, 3149, 3150, 3153, 3159, 3161, 3166, 3168, - 3171, 3184, 3187, 3190, 3194, 3197, 3204, 3206, 3209, 3211, - 3213, 3216, 3219, 3222, 3225, 3227, 3230, 3234, 3236, 3242, - 3244, 3245, 3247, 3252, 3254, 3256, 3258, 3260, 3263, 3264, - 3266, 3269, 3270, 3273, 3273, 3276, 3276, 3279, 3279, 3281, - 3283, 3285, 3287, 3293, 3299, 3302, 3305, 3311, 3313, 3314, - 3317, 3319, 3320, 3321, 3323, 3326, 3329, 3332, 3338, 3342, - 3344, 3347, 3349, 3352, 3356, 3358, 3361, 3363, 3366, 3383, - 3391, 3394, 3396, 3398, 3402, 3405, 3406, 3414, 3418, 3422, - 3425, 3426, 3432, 3435, 3438, 3440, 3444, 3449, 3452, 3462, - 3467, 3468, 3475, 3478, 3481, 3483, 3486, 3488, 3498, 3512, - 3516, 3519, 3521, 3525, 3529, 3532, 3535, 3537, 3541, 3543, - 3550, 3557, 3560, 3564, 3568, 3572, 3578, 3582, 3587, 3589, - 3592, 3597, 3603, 3614, 3617, 3619, 3623, 3631, 3634, 3638, - 3641, 3643, 3645, 3651, 3656, 3659, 3661, 3663, 3665, 3667, - 3669, 3671, 3673, 3675, 3677, 3679, 3681, 3683, 3685, 3687, - 3689, 3691, 3693, 3695, 3697, 3699, 3701, 3703, 3705, 3707, - 3709, 3711, 3713, 3715, 3717, 3719, 3721, 3724, 3726 + 2887, 2889, 2896, 2907, 2913, 2919, 2933, 2935, 2939, 2953, + 2955, 2957, 2961, 2967, 2980, 2983, 2988, 3001, 3007, 3009, + 3010, 3011, 3019, 3024, 3033, 3034, 3038, 3041, 3047, 3053, + 3056, 3058, 3060, 3062, 3066, 3070, 3074, 3077, 3081, 3083, + 3092, 3095, 3097, 3099, 3101, 3103, 3105, 3107, 3109, 3113, + 3117, 3121, 3125, 3127, 3129, 3131, 3133, 3135, 3137, 3139, + 3141, 3149, 3151, 3152, 3153, 3156, 3162, 3164, 3169, 3171, + 3174, 3187, 3190, 3193, 3197, 3200, 3207, 3209, 3212, 3214, + 3216, 3219, 3222, 3225, 3228, 3230, 3233, 3237, 3239, 3245, + 3247, 3248, 3250, 3255, 3257, 3259, 3261, 3263, 3266, 3267, + 3269, 3272, 3273, 3276, 3276, 3279, 3279, 3282, 3282, 3284, + 3286, 3288, 3290, 3296, 3302, 3305, 3308, 3314, 3316, 3317, + 3320, 3322, 3323, 3324, 3326, 3329, 3332, 3335, 3341, 3345, + 3347, 3350, 3352, 3355, 3359, 3361, 3364, 3366, 3369, 3386, + 3394, 3397, 3399, 3401, 3405, 3408, 3409, 3417, 3421, 3425, + 3428, 3429, 3435, 3438, 3441, 3443, 3447, 3452, 3455, 3465, + 3470, 3471, 3478, 3481, 3484, 3486, 3489, 3491, 3501, 3515, + 3519, 3522, 3524, 3528, 3532, 3535, 3538, 3540, 3544, 3546, + 3553, 3560, 3563, 3567, 3571, 3575, 3581, 3585, 3590, 3592, + 3595, 3600, 3606, 3617, 3620, 3622, 3626, 3634, 3637, 3641, + 3644, 3646, 3648, 3654, 3659, 3662, 3664, 3666, 3668, 3670, + 3672, 3674, 3676, 3678, 3680, 3682, 3684, 3686, 3688, 3690, + 3692, 3694, 3696, 3698, 3700, 3702, 3704, 3706, 3708, 3710, + 3712, 3714, 3716, 3718, 3720, 3722, 3724, 3727, 3729 }; #endif @@ -7182,10 +7182,11 @@ case 641: break;} case 642: #line 2890 "parse.y" -{ got_scope = yyval.ttype = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype); ; +{ got_scope = yyval.ttype + = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype, /*complain=*/1); ; break;} case 643: -#line 2897 "parse.y" +#line 2898 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) { @@ -7197,7 +7198,7 @@ case 643: ; break;} case 644: -#line 2907 "parse.y" +#line 2908 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7205,7 +7206,7 @@ case 644: ; break;} case 645: -#line 2913 "parse.y" +#line 2914 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7213,18 +7214,18 @@ case 645: ; break;} case 646: -#line 2919 "parse.y" +#line 2920 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyvsp[-1].ttype)); ; break;} case 648: -#line 2935 "parse.y" +#line 2936 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 649: -#line 2940 "parse.y" +#line 2941 "parse.y" { if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)) == 't') - yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); + yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, /*complain=*/1); else if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) cp_error ("`%T' is not a class or namespace", yyvsp[0].ttype); else @@ -7236,29 +7237,29 @@ case 649: ; break;} case 650: -#line 2953 "parse.y" +#line 2954 "parse.y" { yyval.ttype = TREE_TYPE (yyvsp[0].ttype); ; break;} case 651: -#line 2955 "parse.y" -{ yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); ; +#line 2956 "parse.y" +{ yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, /*complain=*/1); ; break;} case 652: -#line 2957 "parse.y" -{ yyval.ttype = make_typename_type (yyvsp[-2].ttype, yyvsp[0].ttype); ; +#line 2958 "parse.y" +{ yyval.ttype = make_typename_type (yyvsp[-2].ttype, yyvsp[0].ttype, /*complain=*/1); ; break;} case 653: -#line 2962 "parse.y" +#line 2963 "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 2967 "parse.y" +#line 2968 "parse.y" { if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)) == 't') - yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); + yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, /*complain=*/1); else if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) cp_error ("`%T' is not a class or namespace", yyvsp[0].ttype); else @@ -7270,15 +7271,17 @@ case 654: ; break;} case 655: -#line 2980 "parse.y" -{ got_scope = yyval.ttype = make_typename_type (yyvsp[-2].ttype, yyvsp[-1].ttype); ; +#line 2981 "parse.y" +{ got_scope = yyval.ttype + = make_typename_type (yyvsp[-2].ttype, yyvsp[-1].ttype, /*complain=*/1); ; break;} case 656: -#line 2982 "parse.y" -{ got_scope = yyval.ttype = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype); ; +#line 2984 "parse.y" +{ got_scope = yyval.ttype + = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype, /*complain=*/1); ; break;} case 657: -#line 2987 "parse.y" +#line 2990 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE) yyvsp[-1].ttype = lastiddecl; @@ -7292,7 +7295,7 @@ case 657: ; break;} case 658: -#line 2999 "parse.y" +#line 3002 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7300,11 +7303,11 @@ case 658: ; break;} case 659: -#line 3005 "parse.y" +#line 3008 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyval.ttype)); ; break;} case 662: -#line 3009 "parse.y" +#line 3012 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; @@ -7312,11 +7315,11 @@ case 662: ; break;} case 663: -#line 3018 "parse.y" +#line 3021 "parse.y" { yyval.ttype = build_min_nt (TEMPLATE_ID_EXPR, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} case 664: -#line 3023 "parse.y" +#line 3026 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); @@ -7326,59 +7329,59 @@ case 664: ; break;} case 666: -#line 3032 "parse.y" +#line 3035 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 667: -#line 3037 "parse.y" +#line 3040 "parse.y" { got_scope = NULL_TREE; ; break;} case 668: -#line 3039 "parse.y" +#line 3042 "parse.y" { yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ; break;} case 669: -#line 3046 "parse.y" +#line 3049 "parse.y" { got_scope = void_type_node; ; break;} case 670: -#line 3052 "parse.y" +#line 3055 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 671: -#line 3054 "parse.y" +#line 3057 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} case 672: -#line 3056 "parse.y" +#line 3059 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 673: -#line 3058 "parse.y" +#line 3061 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} case 674: -#line 3060 "parse.y" +#line 3063 "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 3064 "parse.y" +#line 3067 "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 3073 "parse.y" +#line 3076 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} case 678: -#line 3075 "parse.y" +#line 3078 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} case 680: -#line 3081 "parse.y" +#line 3084 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ @@ -7386,96 +7389,96 @@ case 680: ; break;} case 681: -#line 3091 "parse.y" +#line 3094 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 682: -#line 3093 "parse.y" +#line 3096 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 683: -#line 3095 "parse.y" +#line 3098 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} case 684: -#line 3097 "parse.y" +#line 3100 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ; break;} case 685: -#line 3099 "parse.y" +#line 3102 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 686: -#line 3101 "parse.y" +#line 3104 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} case 687: -#line 3103 "parse.y" +#line 3106 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} case 688: -#line 3105 "parse.y" +#line 3108 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ; break;} case 689: -#line 3107 "parse.y" +#line 3110 "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 3111 "parse.y" +#line 3114 "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 3120 "parse.y" +#line 3123 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} case 693: -#line 3123 "parse.y" +#line 3126 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 694: -#line 3125 "parse.y" +#line 3128 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 695: -#line 3127 "parse.y" +#line 3130 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} case 696: -#line 3129 "parse.y" +#line 3132 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} case 697: -#line 3131 "parse.y" +#line 3134 "parse.y" { yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 698: -#line 3133 "parse.y" +#line 3136 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 699: -#line 3135 "parse.y" +#line 3138 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 700: -#line 3137 "parse.y" +#line 3140 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} case 701: -#line 3139 "parse.y" +#line 3142 "parse.y" { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); ; break;} case 708: -#line 3162 "parse.y" +#line 3165 "parse.y" { if (pedantic) pedwarn ("ANSI C++ forbids label declarations"); ; break;} case 711: -#line 3173 "parse.y" +#line 3176 "parse.y" { while (yyvsp[-1].ttype) { @@ -7485,181 +7488,181 @@ case 711: ; break;} case 712: -#line 3186 "parse.y" +#line 3189 "parse.y" {; break;} case 714: -#line 3192 "parse.y" +#line 3195 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} case 715: -#line 3194 "parse.y" +#line 3197 "parse.y" { yyval.ttype = finish_compound_stmt (0, yyvsp[-1].ttype); ; break;} case 716: -#line 3199 "parse.y" +#line 3202 "parse.y" { yyval.ttype = begin_if_stmt (); cond_stmt_keyword = "if"; ; break;} case 717: -#line 3204 "parse.y" +#line 3207 "parse.y" { finish_if_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 718: -#line 3206 "parse.y" +#line 3209 "parse.y" { yyval.ttype = finish_then_clause (yyvsp[-3].ttype); ; break;} case 720: -#line 3211 "parse.y" +#line 3214 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} case 721: -#line 3213 "parse.y" +#line 3216 "parse.y" { yyval.ttype = finish_compound_stmt (0, yyvsp[-1].ttype); ; break;} case 722: -#line 3218 "parse.y" +#line 3221 "parse.y" {; break;} case 724: -#line 3224 "parse.y" +#line 3227 "parse.y" { finish_stmt (); ; break;} case 725: -#line 3226 "parse.y" +#line 3229 "parse.y" { finish_expr_stmt (yyvsp[-1].ttype); ; break;} case 726: -#line 3228 "parse.y" +#line 3231 "parse.y" { begin_else_clause (); ; break;} case 727: -#line 3230 "parse.y" +#line 3233 "parse.y" { finish_else_clause (yyvsp[-3].ttype); finish_if_stmt (); ; break;} case 728: -#line 3235 "parse.y" +#line 3238 "parse.y" { finish_if_stmt (); ; break;} case 729: -#line 3237 "parse.y" +#line 3240 "parse.y" { yyval.ttype = begin_while_stmt (); cond_stmt_keyword = "while"; ; break;} case 730: -#line 3242 "parse.y" +#line 3245 "parse.y" { finish_while_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 731: -#line 3244 "parse.y" +#line 3247 "parse.y" { finish_while_stmt (yyvsp[-3].ttype); ; break;} case 732: -#line 3246 "parse.y" +#line 3249 "parse.y" { yyval.ttype = begin_do_stmt (); ; break;} case 733: -#line 3248 "parse.y" +#line 3251 "parse.y" { finish_do_body (yyvsp[-2].ttype); cond_stmt_keyword = "do"; ; break;} case 734: -#line 3253 "parse.y" +#line 3256 "parse.y" { finish_do_stmt (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} case 735: -#line 3255 "parse.y" +#line 3258 "parse.y" { yyval.ttype = begin_for_stmt (); ; break;} case 736: -#line 3257 "parse.y" +#line 3260 "parse.y" { finish_for_init_stmt (yyvsp[-2].ttype); ; break;} case 737: -#line 3259 "parse.y" +#line 3262 "parse.y" { finish_for_cond (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} case 738: -#line 3261 "parse.y" +#line 3264 "parse.y" { finish_for_expr (yyvsp[-1].ttype, yyvsp[-8].ttype); ; break;} case 739: -#line 3263 "parse.y" +#line 3266 "parse.y" { finish_for_stmt (yyvsp[-3].ttype, yyvsp[-10].ttype); ; break;} case 740: -#line 3265 "parse.y" +#line 3268 "parse.y" { yyval.ttype = begin_switch_stmt (); ; break;} case 741: -#line 3267 "parse.y" +#line 3270 "parse.y" { finish_switch_cond (yyvsp[-1].ttype, yyvsp[-3].ttype); ; break;} case 742: -#line 3269 "parse.y" +#line 3272 "parse.y" { finish_switch_stmt (yyvsp[-3].ttype, yyvsp[-5].ttype); ; break;} case 743: -#line 3271 "parse.y" +#line 3274 "parse.y" { finish_case_label (yyvsp[-1].ttype, NULL_TREE); ; break;} case 745: -#line 3274 "parse.y" +#line 3277 "parse.y" { finish_case_label (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} case 747: -#line 3277 "parse.y" +#line 3280 "parse.y" { finish_case_label (NULL_TREE, NULL_TREE); ; break;} case 749: -#line 3280 "parse.y" +#line 3283 "parse.y" { finish_break_stmt (); ; break;} case 750: -#line 3282 "parse.y" +#line 3285 "parse.y" { finish_continue_stmt (); ; break;} case 751: -#line 3284 "parse.y" +#line 3287 "parse.y" { finish_return_stmt (NULL_TREE); ; break;} case 752: -#line 3286 "parse.y" +#line 3289 "parse.y" { finish_return_stmt (yyvsp[-1].ttype); ; break;} case 753: -#line 3288 "parse.y" +#line 3291 "parse.y" { finish_asm_stmt (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, NULL_TREE); ; break;} case 754: -#line 3294 "parse.y" +#line 3297 "parse.y" { finish_asm_stmt (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE); ; break;} case 755: -#line 3300 "parse.y" +#line 3303 "parse.y" { finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} case 756: -#line 3304 "parse.y" +#line 3307 "parse.y" { finish_asm_stmt (yyvsp[-10].ttype, yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype); ; break;} case 757: -#line 3306 "parse.y" +#line 3309 "parse.y" { if (pedantic) pedwarn ("ANSI C++ forbids computed gotos"); @@ -7667,67 +7670,67 @@ case 757: ; break;} case 758: -#line 3312 "parse.y" +#line 3315 "parse.y" { finish_goto_stmt (yyvsp[-1].ttype); ; break;} case 760: -#line 3315 "parse.y" +#line 3318 "parse.y" { error ("label must be followed by statement"); yyungetc ('}', 0); ; break;} case 761: -#line 3318 "parse.y" +#line 3321 "parse.y" { finish_stmt (); ; break;} case 764: -#line 3322 "parse.y" +#line 3325 "parse.y" { do_local_using_decl (yyvsp[0].ttype); ; break;} case 766: -#line 3328 "parse.y" +#line 3331 "parse.y" { yyval.ttype = begin_function_try_block (); ; break;} case 767: -#line 3330 "parse.y" +#line 3333 "parse.y" { finish_function_try_block (yyvsp[-2].ttype); ; break;} case 768: -#line 3332 "parse.y" +#line 3335 "parse.y" { finish_function_handler_sequence (yyvsp[-4].ttype); yyval.itype = yyvsp[-3].itype; ; break;} case 769: -#line 3340 "parse.y" +#line 3343 "parse.y" { yyval.ttype = begin_try_block (); ; break;} case 770: -#line 3342 "parse.y" +#line 3345 "parse.y" { finish_try_block (yyvsp[-1].ttype); ; break;} case 771: -#line 3344 "parse.y" +#line 3347 "parse.y" { finish_handler_sequence (yyvsp[-3].ttype); ; break;} case 774: -#line 3354 "parse.y" +#line 3357 "parse.y" { yyval.ttype = begin_handler(); ; break;} case 775: -#line 3356 "parse.y" +#line 3359 "parse.y" { yyval.ttype = finish_handler_parms (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 776: -#line 3358 "parse.y" +#line 3361 "parse.y" { finish_handler (yyvsp[-1].ttype, yyvsp[-3].ttype); ; break;} case 779: -#line 3368 "parse.y" +#line 3371 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 780: -#line 3384 "parse.y" +#line 3387 "parse.y" { check_for_new_type ("inside exception declarations", yyvsp[-1].ftype); yyval.ttype = start_handler_parms (TREE_PURPOSE (yyvsp[-1].ftype.t), @@ -7735,102 +7738,102 @@ case 780: ; break;} case 781: -#line 3393 "parse.y" +#line 3396 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} case 782: -#line 3395 "parse.y" +#line 3398 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} case 783: -#line 3397 "parse.y" +#line 3400 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} case 784: -#line 3399 "parse.y" +#line 3402 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} case 785: -#line 3404 "parse.y" +#line 3407 "parse.y" { finish_expr_stmt (yyvsp[-1].ttype); ; break;} case 787: -#line 3407 "parse.y" +#line 3410 "parse.y" { if (pedantic) pedwarn ("ANSI C++ forbids compound statements inside for initializations"); ; break;} case 788: -#line 3416 "parse.y" +#line 3419 "parse.y" { emit_line_note (input_filename, lineno); yyval.ttype = NULL_TREE; ; break;} case 789: -#line 3419 "parse.y" +#line 3422 "parse.y" { emit_line_note (input_filename, lineno); ; break;} case 790: -#line 3424 "parse.y" +#line 3427 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 792: -#line 3427 "parse.y" +#line 3430 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 793: -#line 3434 "parse.y" +#line 3437 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 796: -#line 3441 "parse.y" +#line 3444 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} case 797: -#line 3446 "parse.y" +#line 3449 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ; break;} case 798: -#line 3451 "parse.y" +#line 3454 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, NULL_TREE); ; break;} case 799: -#line 3453 "parse.y" +#line 3456 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} case 800: -#line 3464 "parse.y" +#line 3467 "parse.y" { yyval.ttype = empty_parms(); ; break;} case 802: -#line 3469 "parse.y" +#line 3472 "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 803: -#line 3477 "parse.y" +#line 3480 "parse.y" { yyval.ttype = finish_parmlist (yyval.ttype, 0); ; break;} case 804: -#line 3479 "parse.y" +#line 3482 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} case 805: -#line 3482 "parse.y" +#line 3485 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} case 806: -#line 3484 "parse.y" +#line 3487 "parse.y" { yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 1); ; break;} case 807: -#line 3487 "parse.y" +#line 3490 "parse.y" { yyval.ttype = finish_parmlist (NULL_TREE, 1); ; break;} case 808: -#line 3489 "parse.y" +#line 3492 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right @@ -7842,7 +7845,7 @@ case 808: ; break;} case 809: -#line 3499 "parse.y" +#line 3502 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right @@ -7855,99 +7858,99 @@ case 809: ; break;} case 810: -#line 3514 "parse.y" +#line 3517 "parse.y" { maybe_snarf_defarg (); ; break;} case 811: -#line 3516 "parse.y" +#line 3519 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 814: -#line 3527 "parse.y" +#line 3530 "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 815: -#line 3530 "parse.y" +#line 3533 "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 816: -#line 3533 "parse.y" +#line 3536 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[0].ftype); yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ; break;} case 817: -#line 3536 "parse.y" +#line 3539 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} case 818: -#line 3538 "parse.y" +#line 3541 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ; break;} case 820: -#line 3544 "parse.y" +#line 3547 "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 821: -#line 3554 "parse.y" +#line 3557 "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 822: -#line 3558 "parse.y" +#line 3561 "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 823: -#line 3561 "parse.y" +#line 3564 "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 824: -#line 3565 "parse.y" +#line 3568 "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 825: -#line 3569 "parse.y" +#line 3572 "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 826: -#line 3573 "parse.y" +#line 3576 "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 827: -#line 3580 "parse.y" +#line 3583 "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 828: -#line 3583 "parse.y" +#line 3586 "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 831: -#line 3594 "parse.y" +#line 3597 "parse.y" { see_typename (); ; break;} case 832: -#line 3599 "parse.y" +#line 3602 "parse.y" { error ("type specifier omitted for parameter"); yyval.ttype = build_tree_list (integer_type_node, NULL_TREE); ; break;} case 833: -#line 3604 "parse.y" +#line 3607 "parse.y" { error ("type specifier omitted for parameter"); if (TREE_CODE (yyval.ttype) == SCOPE_REF @@ -7958,192 +7961,192 @@ case 833: ; break;} case 834: -#line 3616 "parse.y" +#line 3619 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 835: -#line 3618 "parse.y" +#line 3621 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} case 836: -#line 3620 "parse.y" +#line 3623 "parse.y" { yyval.ttype = empty_except_spec; ; break;} case 837: -#line 3625 "parse.y" +#line 3628 "parse.y" { check_for_new_type ("exception specifier", yyvsp[0].ftype); yyval.ttype = groktypename (yyvsp[0].ftype.t); ; break;} case 838: -#line 3633 "parse.y" +#line 3636 "parse.y" { yyval.ttype = add_exception_specifier (NULL_TREE, yyvsp[0].ttype, 1); ; break;} case 839: -#line 3635 "parse.y" +#line 3638 "parse.y" { yyval.ttype = add_exception_specifier (yyvsp[-2].ttype, yyvsp[0].ttype, 1); ; break;} case 840: -#line 3640 "parse.y" +#line 3643 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 841: -#line 3642 "parse.y" +#line 3645 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 842: -#line 3644 "parse.y" +#line 3647 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 843: -#line 3646 "parse.y" +#line 3649 "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 844: -#line 3653 "parse.y" +#line 3656 "parse.y" { got_scope = NULL_TREE; ; break;} case 845: -#line 3658 "parse.y" +#line 3661 "parse.y" { yyval.ttype = ansi_opname[MULT_EXPR]; ; break;} case 846: -#line 3660 "parse.y" +#line 3663 "parse.y" { yyval.ttype = ansi_opname[TRUNC_DIV_EXPR]; ; break;} case 847: -#line 3662 "parse.y" +#line 3665 "parse.y" { yyval.ttype = ansi_opname[TRUNC_MOD_EXPR]; ; break;} case 848: -#line 3664 "parse.y" +#line 3667 "parse.y" { yyval.ttype = ansi_opname[PLUS_EXPR]; ; break;} case 849: -#line 3666 "parse.y" +#line 3669 "parse.y" { yyval.ttype = ansi_opname[MINUS_EXPR]; ; break;} case 850: -#line 3668 "parse.y" +#line 3671 "parse.y" { yyval.ttype = ansi_opname[BIT_AND_EXPR]; ; break;} case 851: -#line 3670 "parse.y" +#line 3673 "parse.y" { yyval.ttype = ansi_opname[BIT_IOR_EXPR]; ; break;} case 852: -#line 3672 "parse.y" +#line 3675 "parse.y" { yyval.ttype = ansi_opname[BIT_XOR_EXPR]; ; break;} case 853: -#line 3674 "parse.y" +#line 3677 "parse.y" { yyval.ttype = ansi_opname[BIT_NOT_EXPR]; ; break;} case 854: -#line 3676 "parse.y" +#line 3679 "parse.y" { yyval.ttype = ansi_opname[COMPOUND_EXPR]; ; break;} case 855: -#line 3678 "parse.y" +#line 3681 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 856: -#line 3680 "parse.y" +#line 3683 "parse.y" { yyval.ttype = ansi_opname[LT_EXPR]; ; break;} case 857: -#line 3682 "parse.y" +#line 3685 "parse.y" { yyval.ttype = ansi_opname[GT_EXPR]; ; break;} case 858: -#line 3684 "parse.y" +#line 3687 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 859: -#line 3686 "parse.y" +#line 3689 "parse.y" { yyval.ttype = ansi_assopname[yyvsp[0].code]; ; break;} case 860: -#line 3688 "parse.y" +#line 3691 "parse.y" { yyval.ttype = ansi_opname [MODIFY_EXPR]; ; break;} case 861: -#line 3690 "parse.y" +#line 3693 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 862: -#line 3692 "parse.y" +#line 3695 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 863: -#line 3694 "parse.y" +#line 3697 "parse.y" { yyval.ttype = ansi_opname[POSTINCREMENT_EXPR]; ; break;} case 864: -#line 3696 "parse.y" +#line 3699 "parse.y" { yyval.ttype = ansi_opname[PREDECREMENT_EXPR]; ; break;} case 865: -#line 3698 "parse.y" +#line 3701 "parse.y" { yyval.ttype = ansi_opname[TRUTH_ANDIF_EXPR]; ; break;} case 866: -#line 3700 "parse.y" +#line 3703 "parse.y" { yyval.ttype = ansi_opname[TRUTH_ORIF_EXPR]; ; break;} case 867: -#line 3702 "parse.y" +#line 3705 "parse.y" { yyval.ttype = ansi_opname[TRUTH_NOT_EXPR]; ; break;} case 868: -#line 3704 "parse.y" +#line 3707 "parse.y" { yyval.ttype = ansi_opname[COND_EXPR]; ; break;} case 869: -#line 3706 "parse.y" +#line 3709 "parse.y" { yyval.ttype = ansi_opname[yyvsp[0].code]; ; break;} case 870: -#line 3708 "parse.y" +#line 3711 "parse.y" { yyval.ttype = ansi_opname[COMPONENT_REF]; ; break;} case 871: -#line 3710 "parse.y" +#line 3713 "parse.y" { yyval.ttype = ansi_opname[MEMBER_REF]; ; break;} case 872: -#line 3712 "parse.y" +#line 3715 "parse.y" { yyval.ttype = ansi_opname[CALL_EXPR]; ; break;} case 873: -#line 3714 "parse.y" +#line 3717 "parse.y" { yyval.ttype = ansi_opname[ARRAY_REF]; ; break;} case 874: -#line 3716 "parse.y" +#line 3719 "parse.y" { yyval.ttype = ansi_opname[NEW_EXPR]; ; break;} case 875: -#line 3718 "parse.y" +#line 3721 "parse.y" { yyval.ttype = ansi_opname[DELETE_EXPR]; ; break;} case 876: -#line 3720 "parse.y" +#line 3723 "parse.y" { yyval.ttype = ansi_opname[VEC_NEW_EXPR]; ; break;} case 877: -#line 3722 "parse.y" +#line 3725 "parse.y" { yyval.ttype = ansi_opname[VEC_DELETE_EXPR]; ; break;} case 878: -#line 3725 "parse.y" +#line 3728 "parse.y" { yyval.ttype = grokoptypename (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} case 879: -#line 3727 "parse.y" +#line 3730 "parse.y" { yyval.ttype = ansi_opname[ERROR_MARK]; ; break;} } @@ -8368,7 +8371,7 @@ yyerrhandle: } return 1; } -#line 3730 "parse.y" +#line 3733 "parse.y" #ifdef SPEW_DEBUG diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index c33cec03b86..cb6f5f149b9 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -2887,7 +2887,8 @@ nested_name_specifier: | nested_name_specifier nested_name_specifier_1 { $$ = $2; } | nested_name_specifier TEMPLATE explicit_template_type SCOPE - { got_scope = $$ = make_typename_type ($1, $3); } + { got_scope = $$ + = make_typename_type ($1, $3, /*complain=*/1); } ; /* Why the @#$%^& do type_name and notype_identifier need to be expanded @@ -2939,7 +2940,7 @@ typename_sub0: typename_sub1 identifier %prec EMPTY { if (TREE_CODE_CLASS (TREE_CODE ($1)) == 't') - $$ = make_typename_type ($1, $2); + $$ = make_typename_type ($1, $2, /*complain=*/1); else if (TREE_CODE ($2) == IDENTIFIER_NODE) cp_error ("`%T' is not a class or namespace", $2); else @@ -2952,9 +2953,9 @@ typename_sub0: | typename_sub1 template_type %prec EMPTY { $$ = TREE_TYPE ($2); } | typename_sub1 explicit_template_type %prec EMPTY - { $$ = make_typename_type ($1, $2); } + { $$ = make_typename_type ($1, $2, /*complain=*/1); } | typename_sub1 TEMPLATE explicit_template_type %prec EMPTY - { $$ = make_typename_type ($1, $3); } + { $$ = make_typename_type ($1, $3, /*complain=*/1); } ; typename_sub1: @@ -2966,7 +2967,7 @@ typename_sub1: | typename_sub1 typename_sub2 { if (TREE_CODE_CLASS (TREE_CODE ($1)) == 't') - $$ = make_typename_type ($1, $2); + $$ = make_typename_type ($1, $2, /*complain=*/1); else if (TREE_CODE ($2) == IDENTIFIER_NODE) cp_error ("`%T' is not a class or namespace", $2); else @@ -2977,9 +2978,11 @@ typename_sub1: } } | typename_sub1 explicit_template_type SCOPE - { got_scope = $$ = make_typename_type ($1, $2); } + { got_scope = $$ + = make_typename_type ($1, $2, /*complain=*/1); } | typename_sub1 TEMPLATE explicit_template_type SCOPE - { got_scope = $$ = make_typename_type ($1, $3); } + { got_scope = $$ + = make_typename_type ($1, $3, /*complain=*/1); } ; typename_sub2: diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9427314ffa1..4a0d7d12bf7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3156,7 +3156,8 @@ convert_template_argument (parm, arg, args, complain, i, in_decl) cp_pedwarn (" use `typename %E'", arg); arg = make_typename_type (TREE_OPERAND (arg, 0), - TREE_OPERAND (arg, 1)); + TREE_OPERAND (arg, 1), + complain); is_type = 1; } if (is_type != requires_type) @@ -6685,7 +6686,7 @@ tsubst (t, args, complain, in_decl) } } - f = make_typename_type (ctx, f); + f = make_typename_type (ctx, f, complain); if (f == error_mark_node) return f; return cp_build_qualified_type_real (f, diff --git a/gcc/testsuite/g++.old-deja/g++.pt/typename24.C b/gcc/testsuite/g++.old-deja/g++.pt/typename24.C new file mode 100644 index 00000000000..127c5266336 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/typename24.C @@ -0,0 +1,26 @@ +// Build don't link: +// Origin: Mark Mitchell + +class ostream; + +extern ostream& cout; + +class Foo { }; + +ostream &operator<<(ostream &os, const Foo &) +{ + return os; +} + +template +const typename T::fooz &operator<<(const Foo &, const T &t) +{ + return t; +} + +void main() +{ + Foo foo; + + cout << foo; +} -- 2.11.4.GIT