class.c (instantiate_type): Don't just return a known type if it's wrong.
authorJason Merrill <jason@gcc.gnu.org>
Thu, 29 Jan 1998 00:08:53 +0000 (19:08 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 29 Jan 1998 00:08:53 +0000 (19:08 -0500)
* class.c (instantiate_type): Don't just return a known type if
  it's wrong.
* class.c (instantiate_type): Remove handling of FUNCTION_DECL
since that code could never be reached.
* error.c (dump_decl): Avoid aborting in the midst of printing an
error message about an illegal template declaration.
* parse.y (structsp): Print an error message, rather than crashing,
when a class-head does not name a class.
* pt.c (convert_nontype_argument):  Allow REAL_TYPE and COMPLEX_TYPE
template arguments as a g++ extension.
* cp-tree.def (ALIGNOF_EXPR): New tree code.
* decl2.c (grok_alignof): If processing_template_decl, just store
the expression.
* typeck.c (c_alignof): Likewise.
* decl2.c (build_expr_from_tree): Handle ALIGNOF_EXPR.
* error.c (dump_expr): Likewise.
* pt.c (tsubst_copy): Likewise.
* tree.c (cp_tree_equal): Likewise.
* pt.c (uses_template_parms): Correctly determine whether or not a
SIZEOF_EXPR/ALIGNOF_EXPR uses template parameters so that constant
folding can be done.

From-SVN: r17545

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.def
gcc/cp/decl2.c
gcc/cp/error.c
gcc/cp/parse.c
gcc/cp/parse.y
gcc/cp/pt.c
gcc/cp/tree.c
gcc/cp/typeck.c

index 42bc3ea04e29f169b7cee9117f82798cefabe184..6d033b7a3b03880238ae7e2b3b87a8feb528ff69 100644 (file)
@@ -1,5 +1,34 @@
+Wed Jan 28 23:14:44 1998  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * class.c (instantiate_type): Don't just return a known type if
+       it's wrong.
+
 Wed Jan 28 11:04:07 1998  Mark Mitchell  <mmitchell@usa.net>
 
+       * class.c (instantiate_type): Remove handling of FUNCTION_DECL
+       since that code could never be reached.
+       
+       * error.c (dump_decl): Avoid aborting in the midst of printing an
+       error message about an illegal template declaration.
+
+       * parse.y (structsp): Print an error message, rather than crashing,
+       when a class-head does not name a class.
+
+       * pt.c (convert_nontype_argument):  Allow REAL_TYPE and COMPLEX_TYPE
+       template arguments as a g++ extension.
+       
+       * cp-tree.def (ALIGNOF_EXPR): New tree code.
+       * decl2.c (grok_alignof): If processing_template_decl, just store
+       the expression.
+       * typeck.c (c_alignof): Likewise.
+       * decl2.c (build_expr_from_tree): Handle ALIGNOF_EXPR.
+       * error.c (dump_expr): Likewise.
+       * pt.c (tsubst_copy): Likewise.
+       * tree.c (cp_tree_equal): Likewise.
+       * pt.c (uses_template_parms): Correctly determine whether or not a
+       SIZEOF_EXPR/ALIGNOF_EXPR uses template parameters so that constant
+       folding can be done.
+       
        * cp-tree.h (grok_enum_decls): Remove type parameter.
        * decl.c (grok_enum_decls): Likewise.
        * decl2.c (grok_x_components): Call grok_enum_decls
index 16fd55577000fd089b8e3ff04865607cc318ed42..0e042ee2b5861f403b9559c5351b16c4366c406a 100644 (file)
@@ -4979,7 +4979,14 @@ instantiate_type (lhstype, rhs, complain)
     }
 
   if (TREE_TYPE (rhs) != NULL_TREE && ! (type_unknown_p (rhs)))
-    return rhs;
+    {
+      if (comptypes (lhstype, TREE_TYPE (rhs), 1))
+       return rhs;
+      if (complain)
+       cp_error ("argument of type `%T' does not match `%T'",
+                 TREE_TYPE (rhs), lhstype);
+      return error_mark_node;
+    }
 
   rhs = copy_node (rhs);
 
@@ -5425,16 +5432,6 @@ instantiate_type (lhstype, rhs, complain)
     case ERROR_MARK:
       return error_mark_node;
 
-    case FUNCTION_DECL:
-      if (!comptypes (lhstype, TREE_TYPE (rhs), 1))
-       {
-         if (complain)
-           cp_error ("%D is not of type %T", rhs, lhstype);
-         return error_mark_node;
-       }
-      else
-       return rhs;
-
     default:
       my_friendly_abort (185);
       return error_mark_node;
index 5d3f75f74d3888a7ca9100227115afe8484e7d27..ab126fa707206797b8acaf475404d0f8bccea309 100644 (file)
@@ -142,6 +142,7 @@ DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", '1', 1)
 DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", '1', 1)
 DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", '1', 1)
 DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", '1', 1)
+DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1)
 DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1)
 DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", 'e', 2)
 DEFTREECODE (TYPEID_EXPR, "typeid_expr", 'e', 1)
index 253e8bf598c655bb6e7aa88518026cb4ee552091..beae07ad047299fdffb5bee4b0a7bdd8c535684e 100644 (file)
@@ -1119,6 +1119,9 @@ grok_alignof (expr)
   tree best, t;
   int bestalign;
 
+  if (processing_template_decl)
+    return build_min (ALIGNOF_EXPR, sizetype, expr);
+
   if (TREE_CODE (expr) == COMPONENT_REF
       && DECL_BIT_FIELD (TREE_OPERAND (expr, 1)))
     error ("`__alignof__' applied to a bit-field");
@@ -3505,11 +3508,12 @@ build_expr_from_tree (t)
                              build_expr_from_tree (TREE_OPERAND (t, 1)));
 
     case SIZEOF_EXPR:
+    case ALIGNOF_EXPR:
       {
        tree r = build_expr_from_tree (TREE_OPERAND (t, 0));
        if (TREE_CODE_CLASS (TREE_CODE (r)) != 't')
          r = TREE_TYPE (r);
-       return c_sizeof (r);
+       return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r);
       }
 
     case MODOP_EXPR:
index 25da8fd86e3cbc2ea62e65537546ab9facf44763..d21e722d959dd6db33881582d97196fc20467248 100644 (file)
@@ -812,7 +812,8 @@ dump_decl (t, v)
            break;
 
          default:
-           my_friendly_abort (353);
+           /* This case can occur with some illegal code.  */
+           dump_type (TREE_TYPE (t), v);
          }
       }
       break;
@@ -1586,7 +1587,14 @@ dump_expr (t, nop)
       break;
 
     case SIZEOF_EXPR:
-      OB_PUTS ("sizeof (");
+    case ALIGNOF_EXPR:
+      if (TREE_CODE (t) == SIZEOF_EXPR)
+       OB_PUTS ("sizeof (");
+      else 
+       {
+         my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
+         OB_PUTS ("__alignof__ (");
+       }
       if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't')
        dump_type (TREE_OPERAND (t, 0), 0);
       else
index 1c60139b732a357e946d089d80ba1a31d95aa9d0..d9b4f301baa4fcfdab3d91e24dec814c107be4e8 100644 (file)
@@ -659,46 +659,46 @@ static const short yyrline[] = { 0,
   2190,  2196,  2198,  2201,  2204,  2207,  2213,  2216,  2219,  2221,
   2223,  2225,  2229,  2235,  2243,  2245,  2249,  2251,  2256,  2259,
   2262,  2264,  2266,  2270,  2274,  2279,  2283,  2286,  2291,  2295,
-  2298,  2301,  2305,  2341,  2347,  2356,  2368,  2370,  2373,  2375,
-  2380,  2382,  2384,  2386,  2388,  2392,  2397,  2402,  2408,  2413,
-  2418,  2420,  2424,  2429,  2432,  2439,  2467,  2473,  2475,  2478,
-  2481,  2483,  2487,  2489,  2493,  2519,  2548,  2551,  2552,  2573,
-  2596,  2598,  2602,  2628,  2637,  2726,  2733,  2736,  2744,  2755,
-  2764,  2768,  2783,  2786,  2791,  2793,  2795,  2797,  2799,  2801,
-  2806,  2812,  2814,  2817,  2820,  2822,  2833,  2838,  2841,  2843,
-  2848,  2851,  2852,  2863,  2866,  2867,  2878,  2880,  2883,  2885,
-  2888,  2895,  2903,  2910,  2916,  2922,  2930,  2934,  2939,  2943,
-  2946,  2955,  2957,  2961,  2964,  2969,  2973,  2978,  2988,  2991,
-  2995,  2999,  3007,  3012,  3018,  3021,  3023,  3025,  3031,  3034,
-  3036,  3038,  3040,  3044,  3047,  3068,  3078,  3080,  3081,  3085,
-  3090,  3093,  3095,  3097,  3099,  3103,  3109,  3112,  3114,  3116,
-  3118,  3122,  3125,  3128,  3130,  3132,  3134,  3138,  3141,  3144,
-  3146,  3148,  3150,  3157,  3168,  3172,  3177,  3181,  3186,  3188,
-  3192,  3195,  3197,  3201,  3203,  3204,  3207,  3209,  3215,  3230,
-  3236,  3242,  3256,  3258,  3262,  3278,  3284,  3299,  3306,  3312,
-  3314,  3315,  3316,  3324,  3333,  3334,  3338,  3341,  3347,  3353,
-  3356,  3358,  3360,  3362,  3366,  3370,  3374,  3377,  3382,  3385,
-  3387,  3389,  3391,  3393,  3395,  3397,  3399,  3403,  3407,  3411,
-  3415,  3416,  3418,  3420,  3422,  3424,  3426,  3428,  3430,  3432,
-  3440,  3442,  3443,  3444,  3447,  3455,  3460,  3467,  3469,  3474,
-  3476,  3479,  3493,  3496,  3499,  3508,  3520,  3531,  3551,  3561,
-  3564,  3572,  3584,  3587,  3590,  3593,  3609,  3612,  3623,  3624,
-  3628,  3643,  3662,  3674,  3688,  3702,  3715,  3734,  3752,  3771,
-  3779,  3800,  3818,  3831,  3832,  3835,  3835,  3838,  3838,  3841,
-  3841,  3847,  3853,  3856,  3861,  3868,  3877,  3886,  3895,  3903,
-  3916,  3918,  3922,  3924,  3927,  3934,  3937,  3945,  3961,  3972,
-  3984,  3986,  3989,  3999,  4009,  4020,  4022,  4024,  4027,  4044,
-  4050,  4058,  4060,  4062,  4066,  4069,  4070,  4078,  4082,  4086,
-  4089,  4090,  4096,  4099,  4102,  4104,  4108,  4113,  4116,  4126,
-  4131,  4132,  4140,  4146,  4151,  4155,  4160,  4164,  4168,  4172,
-  4177,  4188,  4202,  4206,  4209,  4211,  4215,  4219,  4222,  4225,
-  4227,  4231,  4233,  4240,  4247,  4250,  4253,  4257,  4261,  4267,
-  4271,  4276,  4278,  4281,  4286,  4292,  4303,  4306,  4308,  4312,
-  4317,  4319,  4326,  4329,  4331,  4333,  4339,  4344,  4347,  4349,
-  4351,  4353,  4355,  4357,  4359,  4361,  4363,  4365,  4367,  4369,
-  4371,  4373,  4375,  4377,  4379,  4381,  4383,  4385,  4387,  4389,
-  4391,  4393,  4395,  4397,  4399,  4401,  4403,  4405,  4407,  4409,
-  4412,  4414
+  2298,  2301,  2305,  2341,  2347,  2356,  2376,  2378,  2381,  2383,
+  2388,  2390,  2392,  2394,  2396,  2400,  2405,  2410,  2416,  2421,
+  2426,  2428,  2432,  2437,  2440,  2447,  2475,  2481,  2483,  2486,
+  2489,  2491,  2495,  2497,  2501,  2527,  2556,  2559,  2560,  2581,
+  2604,  2606,  2610,  2636,  2645,  2734,  2741,  2744,  2752,  2763,
+  2772,  2776,  2791,  2794,  2799,  2801,  2803,  2805,  2807,  2809,
+  2814,  2820,  2822,  2825,  2828,  2830,  2841,  2846,  2849,  2851,
+  2856,  2859,  2860,  2871,  2874,  2875,  2886,  2888,  2891,  2893,
+  2896,  2903,  2911,  2918,  2924,  2930,  2938,  2942,  2947,  2951,
+  2954,  2963,  2965,  2969,  2972,  2977,  2981,  2986,  2996,  2999,
+  3003,  3007,  3015,  3020,  3026,  3029,  3031,  3033,  3039,  3042,
+  3044,  3046,  3048,  3052,  3055,  3076,  3086,  3088,  3089,  3093,
+  3098,  3101,  3103,  3105,  3107,  3111,  3117,  3120,  3122,  3124,
+  3126,  3130,  3133,  3136,  3138,  3140,  3142,  3146,  3149,  3152,
+  3154,  3156,  3158,  3165,  3176,  3180,  3185,  3189,  3194,  3196,
+  3200,  3203,  3205,  3209,  3211,  3212,  3215,  3217,  3223,  3238,
+  3244,  3250,  3264,  3266,  3270,  3286,  3292,  3307,  3314,  3320,
+  3322,  3323,  3324,  3332,  3341,  3342,  3346,  3349,  3355,  3361,
+  3364,  3366,  3368,  3370,  3374,  3378,  3382,  3385,  3390,  3393,
+  3395,  3397,  3399,  3401,  3403,  3405,  3407,  3411,  3415,  3419,
+  3423,  3424,  3426,  3428,  3430,  3432,  3434,  3436,  3438,  3440,
+  3448,  3450,  3451,  3452,  3455,  3463,  3468,  3475,  3477,  3482,
+  3484,  3487,  3501,  3504,  3507,  3516,  3528,  3539,  3559,  3569,
+  3572,  3580,  3592,  3595,  3598,  3601,  3617,  3620,  3631,  3632,
+  3636,  3651,  3670,  3682,  3696,  3710,  3723,  3742,  3760,  3779,
+  3787,  3808,  3826,  3839,  3840,  3843,  3843,  3846,  3846,  3849,
+  3849,  3855,  3861,  3864,  3869,  3876,  3885,  3894,  3903,  3911,
+  3924,  3926,  3930,  3932,  3935,  3942,  3945,  3953,  3969,  3980,
+  3992,  3994,  3997,  4007,  4017,  4028,  4030,  4032,  4035,  4052,
+  4058,  4066,  4068,  4070,  4074,  4077,  4078,  4086,  4090,  4094,
+  4097,  4098,  4104,  4107,  4110,  4112,  4116,  4121,  4124,  4134,
+  4139,  4140,  4148,  4154,  4159,  4163,  4168,  4172,  4176,  4180,
+  4185,  4196,  4210,  4214,  4217,  4219,  4223,  4227,  4230,  4233,
+  4235,  4239,  4241,  4248,  4255,  4258,  4261,  4265,  4269,  4275,
+  4279,  4284,  4286,  4289,  4294,  4300,  4311,  4314,  4316,  4320,
+  4325,  4327,  4334,  4337,  4339,  4341,  4347,  4352,  4355,  4357,
+  4359,  4361,  4363,  4365,  4367,  4369,  4371,  4373,  4375,  4377,
+  4379,  4381,  4383,  4385,  4387,  4389,  4391,  4393,  4395,  4397,
+  4399,  4401,  4403,  4405,  4407,  4409,  4411,  4413,  4415,  4417,
+  4420,  4422
 };
 #endif
 
@@ -6233,83 +6233,91 @@ case 455:
 case 456:
 #line 2357 "parse.y"
 {
-                 yyval.ftype.t = yyvsp[0].ttype;
                  yyval.ftype.new_type_flag = 0;
-                 /* struct B: public A; is not accepted by the WP grammar.  */
-                 if (TYPE_BINFO_BASETYPES (yyval.ftype.t) && !TYPE_SIZE (yyval.ftype.t)
-                     && ! TYPE_BEING_DEFINED (yyval.ftype.t))
-                   cp_error ("base clause without member specification for `%#T'",
-                             yyval.ftype.t);
+                 if (TYPE_BINFO (yyvsp[0].ttype) == NULL_TREE)
+                   {
+                     cp_error ("%T is not a class type", yyvsp[0].ttype);
+                     yyval.ftype.t = error_mark_node;
+                   } 
+                 else
+                   {
+                     yyval.ftype.t = yyvsp[0].ttype;
+                     /* struct B: public A; is not accepted by the WP grammar.  */
+                     if (TYPE_BINFO_BASETYPES (yyval.ftype.t) && !TYPE_SIZE (yyval.ftype.t)
+                         && ! TYPE_BEING_DEFINED (yyval.ftype.t))
+                       cp_error ("base clause without member specification for `%#T'",
+                                 yyval.ftype.t);
+                   }
                ;
     break;}
 case 460:
-#line 2376 "parse.y"
+#line 2384 "parse.y"
 { if (pedantic && !in_system_header)
                    pedwarn ("comma at end of enumerator list"); ;
     break;}
 case 462:
-#line 2383 "parse.y"
+#line 2391 "parse.y"
 { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ;
     break;}
 case 463:
-#line 2385 "parse.y"
+#line 2393 "parse.y"
 { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ;
     break;}
 case 464:
-#line 2387 "parse.y"
+#line 2395 "parse.y"
 { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ;
     break;}
 case 465:
-#line 2389 "parse.y"
+#line 2397 "parse.y"
 { error ("no body nor ';' separates two class, struct or union declarations"); ;
     break;}
 case 466:
-#line 2394 "parse.y"
+#line 2402 "parse.y"
 { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 467:
-#line 2399 "parse.y"
+#line 2407 "parse.y"
 { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 468:
-#line 2404 "parse.y"
+#line 2412 "parse.y"
 {
                  current_aggr = yyvsp[-2].ttype;
                  yyval.ttype = handle_class_head (yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype);
                ;
     break;}
 case 469:
-#line 2409 "parse.y"
+#line 2417 "parse.y"
 {
                  current_aggr = yyvsp[-3].ttype;
                  yyval.ttype = handle_class_head (yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype);
                ;
     break;}
 case 470:
-#line 2414 "parse.y"
+#line 2422 "parse.y"
 {
                  current_aggr = yyvsp[-2].ttype;
                  yyval.ttype = handle_class_head (yyvsp[-2].ttype, NULL_TREE, yyvsp[0].ttype);
                ;
     break;}
 case 471:
-#line 2419 "parse.y"
+#line 2427 "parse.y"
 { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 472:
-#line 2421 "parse.y"
+#line 2429 "parse.y"
 { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 473:
-#line 2426 "parse.y"
+#line 2434 "parse.y"
 { yyval.ttype = xref_tag (current_aggr, yyvsp[0].ttype, NULL_TREE, 0); ;
     break;}
 case 474:
-#line 2431 "parse.y"
+#line 2439 "parse.y"
 { yyval.ttype = xref_tag (current_aggr, yyvsp[0].ttype, NULL_TREE, 1); ;
     break;}
 case 475:
-#line 2434 "parse.y"
+#line 2442 "parse.y"
 { 
                  yyval.ttype = yyvsp[-1].ttype;
                  if (yyvsp[0].ttype)
@@ -6317,7 +6325,7 @@ case 475:
                ;
     break;}
 case 476:
-#line 2440 "parse.y"
+#line 2448 "parse.y"
 { 
                  yyval.ttype = TREE_TYPE (yyvsp[-1].ttype);
                  if (TREE_INT_CST_LOW (current_aggr) == union_type 
@@ -6345,28 +6353,28 @@ case 476:
                ;
     break;}
 case 477:
-#line 2469 "parse.y"
+#line 2477 "parse.y"
 { yyval.ttype = xref_tag (yyval.ttype, make_anon_name (), NULL_TREE, 0);
                  yyungetc ('{', 1); ;
     break;}
 case 480:
-#line 2480 "parse.y"
+#line 2488 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 481:
-#line 2482 "parse.y"
+#line 2490 "parse.y"
 { yyungetc(':', 1); yyval.ttype = NULL_TREE; ;
     break;}
 case 482:
-#line 2484 "parse.y"
+#line 2492 "parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 484:
-#line 2490 "parse.y"
+#line 2498 "parse.y"
 { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ;
     break;}
 case 485:
-#line 2495 "parse.y"
+#line 2503 "parse.y"
 {
                  tree type = TREE_TYPE (yyvsp[0].ttype);
                  if (! is_aggr_type (type, 1))
@@ -6393,7 +6401,7 @@ case 485:
                ;
     break;}
 case 486:
-#line 2520 "parse.y"
+#line 2528 "parse.y"
 {
                  tree type = TREE_TYPE (yyvsp[0].ttype);
                  if (current_aggr == signature_type_node)
@@ -6422,11 +6430,11 @@ case 486:
                ;
     break;}
 case 487:
-#line 2550 "parse.y"
+#line 2558 "parse.y"
 { yyval.ttype = TYPE_MAIN_DECL (yyvsp[0].ttype); ;
     break;}
 case 489:
-#line 2553 "parse.y"
+#line 2561 "parse.y"
 {
                  if (current_aggr == signature_type_node)
                    {
@@ -6449,7 +6457,7 @@ case 489:
                ;
     break;}
 case 490:
-#line 2574 "parse.y"
+#line 2582 "parse.y"
 {
                  if (current_aggr == signature_type_node)
                    {
@@ -6472,13 +6480,13 @@ case 490:
                ;
     break;}
 case 492:
-#line 2599 "parse.y"
+#line 2607 "parse.y"
 { if (yyval.ttype != ridpointers[(int)RID_VIRTUAL])
                    sorry ("non-virtual access");
                  yyval.ttype = access_default_virtual_node; ;
     break;}
 case 493:
-#line 2603 "parse.y"
+#line 2611 "parse.y"
 { int err = 0;
                  if (yyvsp[-1].ttype == access_protected_node)
                    {
@@ -6506,7 +6514,7 @@ case 493:
                ;
     break;}
 case 494:
-#line 2629 "parse.y"
+#line 2637 "parse.y"
 { if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL])
                    sorry ("non-virtual access");
                  if (yyval.ttype == access_public_node)
@@ -6515,7 +6523,7 @@ case 494:
                    yyval.ttype = access_private_virtual_node; ;
     break;}
 case 495:
-#line 2639 "parse.y"
+#line 2647 "parse.y"
 { tree t = yyvsp[-1].ttype;
                  push_obstacks_nochange ();
                  end_temporary_allocation ();
@@ -6603,17 +6611,17 @@ case 495:
                ;
     break;}
 case 496:
-#line 2728 "parse.y"
+#line 2736 "parse.y"
 {
                    yyval.ttype = build_self_reference ();
                ;
     break;}
 case 497:
-#line 2735 "parse.y"
+#line 2743 "parse.y"
 { if (yyval.ttype) yyval.ttype = build_tree_list (access_public_node, yyval.ttype); ;
     break;}
 case 498:
-#line 2737 "parse.y"
+#line 2745 "parse.y"
 {
                  if (current_aggr == signature_type_node)
                    yyval.ttype = build_tree_list (access_public_node, yyvsp[0].ttype);
@@ -6623,7 +6631,7 @@ case 498:
                ;
     break;}
 case 499:
-#line 2745 "parse.y"
+#line 2753 "parse.y"
 {
                  tree visspec = yyvsp[-2].ttype;
 
@@ -6636,19 +6644,19 @@ case 499:
                ;
     break;}
 case 500:
-#line 2756 "parse.y"
+#line 2764 "parse.y"
 {
                  if (current_aggr == signature_type_node)
                    error ("access specifier not allowed in signature");
                ;
     break;}
 case 501:
-#line 2766 "parse.y"
+#line 2774 "parse.y"
 { if (yyval.ttype == void_type_node) yyval.ttype = NULL_TREE; 
                ;
     break;}
 case 502:
-#line 2769 "parse.y"
+#line 2777 "parse.y"
 { /* In pushdecl, we created a reverse list of names
                     in this binding level.  Make sure that the chain
                     of what we're trying to add isn't the item itself
@@ -6663,91 +6671,91 @@ case 502:
                ;
     break;}
 case 503:
-#line 2785 "parse.y"
+#line 2793 "parse.y"
 { ;
     break;}
 case 504:
-#line 2787 "parse.y"
+#line 2795 "parse.y"
 { error ("missing ';' before right brace");
                  yyungetc ('}', 0); ;
     break;}
 case 505:
-#line 2792 "parse.y"
+#line 2800 "parse.y"
 { yyval.ttype = finish_method (yyval.ttype); ;
     break;}
 case 506:
-#line 2794 "parse.y"
+#line 2802 "parse.y"
 { yyval.ttype = finish_method (yyval.ttype); ;
     break;}
 case 507:
-#line 2796 "parse.y"
+#line 2804 "parse.y"
 { yyval.ttype = finish_method (yyval.ttype); ;
     break;}
 case 508:
-#line 2798 "parse.y"
+#line 2806 "parse.y"
 { yyval.ttype = finish_method (yyval.ttype); ;
     break;}
 case 509:
-#line 2800 "parse.y"
+#line 2808 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 510:
-#line 2802 "parse.y"
+#line 2810 "parse.y"
 { yyval.ttype = yyvsp[0].ttype;
                  pedantic = yyvsp[-1].itype; ;
     break;}
 case 511:
-#line 2811 "parse.y"
+#line 2819 "parse.y"
 { yyval.ttype = grok_x_components (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 512:
-#line 2813 "parse.y"
+#line 2821 "parse.y"
 { yyval.ttype = grok_x_components (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 513:
-#line 2815 "parse.y"
+#line 2823 "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 514:
-#line 2818 "parse.y"
+#line 2826 "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 515:
-#line 2821 "parse.y"
+#line 2829 "parse.y"
 { yyval.ttype = grokbitfield (NULL_TREE, NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 516:
-#line 2823 "parse.y"
+#line 2831 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 517:
-#line 2834 "parse.y"
+#line 2842 "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 518:
-#line 2839 "parse.y"
+#line 2847 "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 519:
-#line 2842 "parse.y"
+#line 2850 "parse.y"
 { yyval.ttype = do_class_using_decl (yyvsp[0].ttype); ;
     break;}
 case 520:
-#line 2844 "parse.y"
+#line 2852 "parse.y"
 { yyval.ttype = finish_member_template_decl (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 521:
-#line 2850 "parse.y"
+#line 2858 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 523:
-#line 2853 "parse.y"
+#line 2861 "parse.y"
 {
                  /* In this context, void_type_node encodes
                     friends.  They have been recorded elsewhere.  */
@@ -6758,11 +6766,11 @@ case 523:
                ;
     break;}
 case 524:
-#line 2865 "parse.y"
+#line 2873 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 526:
-#line 2868 "parse.y"
+#line 2876 "parse.y"
 {
                  /* In this context, void_type_node encodes
                     friends.  They have been recorded elsewhere.  */
@@ -6773,7 +6781,7 @@ case 526:
                ;
     break;}
 case 531:
-#line 2890 "parse.y"
+#line 2898 "parse.y"
 { split_specs_attrs (yyvsp[-4].ttype, &current_declspecs,
                                     &prefix_attributes);
                  yyvsp[-4].ttype = current_declspecs;
@@ -6781,7 +6789,7 @@ case 531:
                                  build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ;
     break;}
 case 532:
-#line 2896 "parse.y"
+#line 2904 "parse.y"
 { split_specs_attrs (yyvsp[-4].ttype, &current_declspecs,
                                     &prefix_attributes);
                  yyvsp[-4].ttype = current_declspecs;
@@ -6789,7 +6797,7 @@ case 532:
                  cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 533:
-#line 2905 "parse.y"
+#line 2913 "parse.y"
 { split_specs_attrs (yyvsp[-4].ttype, &current_declspecs,
                                     &prefix_attributes);
                  yyvsp[-4].ttype = current_declspecs;
@@ -6797,7 +6805,7 @@ case 533:
                                  build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ;
     break;}
 case 534:
-#line 2911 "parse.y"
+#line 2919 "parse.y"
 { split_specs_attrs (yyvsp[-4].ttype, &current_declspecs,
                                     &prefix_attributes);
                  yyvsp[-4].ttype = current_declspecs;
@@ -6805,7 +6813,7 @@ case 534:
                                  build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ;
     break;}
 case 535:
-#line 2917 "parse.y"
+#line 2925 "parse.y"
 { split_specs_attrs (yyvsp[-4].ttype, &current_declspecs,
                                     &prefix_attributes);
                  yyvsp[-4].ttype = current_declspecs;
@@ -6813,7 +6821,7 @@ case 535:
                  cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 536:
-#line 2923 "parse.y"
+#line 2931 "parse.y"
 { split_specs_attrs (yyvsp[-3].ttype, &current_declspecs,
                                     &prefix_attributes);
                  yyvsp[-3].ttype = current_declspecs;
@@ -6821,54 +6829,54 @@ case 536:
                  cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 537:
-#line 2932 "parse.y"
+#line 2940 "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 538:
-#line 2935 "parse.y"
+#line 2943 "parse.y"
 { yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype);
                  cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 539:
-#line 2941 "parse.y"
+#line 2949 "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 540:
-#line 2944 "parse.y"
+#line 2952 "parse.y"
 { yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype);
                  cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 541:
-#line 2947 "parse.y"
+#line 2955 "parse.y"
 { yyval.ttype = grokbitfield (NULL_TREE, current_declspecs, yyvsp[-1].ttype);
                  cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 543:
-#line 2958 "parse.y"
+#line 2966 "parse.y"
 { TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 544:
-#line 2963 "parse.y"
+#line 2971 "parse.y"
 { yyval.ttype = build_enumerator (yyval.ttype, NULL_TREE); ;
     break;}
 case 545:
-#line 2965 "parse.y"
+#line 2973 "parse.y"
 { yyval.ttype = build_enumerator (yyval.ttype, yyvsp[0].ttype); ;
     break;}
 case 546:
-#line 2971 "parse.y"
+#line 2979 "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 547:
-#line 2974 "parse.y"
+#line 2982 "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 548:
-#line 2979 "parse.y"
+#line 2987 "parse.y"
 {
                  if (pedantic)
                    pedwarn ("ANSI C++ forbids array dimensions with parenthesized type in new");
@@ -6878,71 +6886,71 @@ case 548:
                ;
     break;}
 case 549:
-#line 2990 "parse.y"
+#line 2998 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 550:
-#line 2992 "parse.y"
+#line 3000 "parse.y"
 { yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ;
     break;}
 case 551:
-#line 2997 "parse.y"
+#line 3005 "parse.y"
 { yyval.ftype.t = IDENTIFIER_AS_LIST (yyvsp[0].ttype); 
                  yyval.ftype.new_type_flag = 0; ;
     break;}
 case 552:
-#line 3000 "parse.y"
+#line 3008 "parse.y"
 { yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ftype.t); 
                  yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
     break;}
 case 553:
-#line 3009 "parse.y"
+#line 3017 "parse.y"
 { yyval.itype = suspend_momentary (); ;
     break;}
 case 554:
-#line 3014 "parse.y"
+#line 3022 "parse.y"
 { resume_momentary ((int) yyvsp[-1].itype); yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 555:
-#line 3020 "parse.y"
+#line 3028 "parse.y"
 { resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 556:
-#line 3022 "parse.y"
+#line 3030 "parse.y"
 { resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 557:
-#line 3024 "parse.y"
+#line 3032 "parse.y"
 { resume_momentary ((int) yyvsp[-1].itype); yyval.ttype = empty_parms (); ;
     break;}
 case 558:
-#line 3026 "parse.y"
+#line 3034 "parse.y"
 { resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = NULL_TREE; ;
     break;}
 case 559:
-#line 3033 "parse.y"
+#line 3041 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 560:
-#line 3035 "parse.y"
+#line 3043 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 561:
-#line 3037 "parse.y"
+#line 3045 "parse.y"
 { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 562:
-#line 3039 "parse.y"
+#line 3047 "parse.y"
 { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 563:
-#line 3041 "parse.y"
+#line 3049 "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 565:
-#line 3049 "parse.y"
+#line 3057 "parse.y"
 {
                  if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE)
                    {
@@ -6964,7 +6972,7 @@ case 565:
                ;
     break;}
 case 566:
-#line 3069 "parse.y"
+#line 3077 "parse.y"
 {
                  if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE)
                    yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype);
@@ -6974,97 +6982,97 @@ case 566:
                ;
     break;}
 case 569:
-#line 3082 "parse.y"
+#line 3090 "parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 570:
-#line 3087 "parse.y"
+#line 3095 "parse.y"
 { yyval.ttype = get_type_decl (yyvsp[0].ttype); ;
     break;}
 case 571:
-#line 3092 "parse.y"
+#line 3100 "parse.y"
 { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 572:
-#line 3094 "parse.y"
+#line 3102 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ;
     break;}
 case 573:
-#line 3096 "parse.y"
+#line 3104 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ;
     break;}
 case 574:
-#line 3098 "parse.y"
+#line 3106 "parse.y"
 { yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 575:
-#line 3100 "parse.y"
+#line 3108 "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 577:
-#line 3111 "parse.y"
+#line 3119 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 578:
-#line 3113 "parse.y"
+#line 3121 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 579:
-#line 3115 "parse.y"
+#line 3123 "parse.y"
 { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 580:
-#line 3117 "parse.y"
+#line 3125 "parse.y"
 { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 581:
-#line 3119 "parse.y"
+#line 3127 "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 583:
-#line 3127 "parse.y"
+#line 3135 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 584:
-#line 3129 "parse.y"
+#line 3137 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 585:
-#line 3131 "parse.y"
+#line 3139 "parse.y"
 { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 586:
-#line 3133 "parse.y"
+#line 3141 "parse.y"
 { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 587:
-#line 3135 "parse.y"
+#line 3143 "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 589:
-#line 3143 "parse.y"
+#line 3151 "parse.y"
 { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 590:
-#line 3145 "parse.y"
+#line 3153 "parse.y"
 { yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 591:
-#line 3147 "parse.y"
+#line 3155 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ;
     break;}
 case 592:
-#line 3149 "parse.y"
+#line 3157 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ;
     break;}
 case 593:
-#line 3151 "parse.y"
+#line 3159 "parse.y"
 { if (OP0 (yyval.ttype) != current_class_type)
                    {
                      push_nested_class (OP0 (yyval.ttype), 3);
@@ -7073,7 +7081,7 @@ case 593:
                ;
     break;}
 case 594:
-#line 3158 "parse.y"
+#line 3166 "parse.y"
 { got_scope = NULL_TREE;
                  yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype);
                  if (yyvsp[-1].ttype != current_class_type)
@@ -7084,47 +7092,47 @@ case 594:
                ;
     break;}
 case 595:
-#line 3170 "parse.y"
+#line 3178 "parse.y"
 { got_scope = NULL_TREE;
                  yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ;
     break;}
 case 596:
-#line 3173 "parse.y"
+#line 3181 "parse.y"
 { got_scope = NULL_TREE;
                  yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 597:
-#line 3179 "parse.y"
+#line 3187 "parse.y"
 { got_scope = NULL_TREE;
                  yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ;
     break;}
 case 598:
-#line 3182 "parse.y"
+#line 3190 "parse.y"
 { got_scope = NULL_TREE;
                  yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 600:
-#line 3189 "parse.y"
+#line 3197 "parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 601:
-#line 3194 "parse.y"
+#line 3202 "parse.y"
 { yyval.ttype = build_functional_cast (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ;
     break;}
 case 602:
-#line 3196 "parse.y"
+#line 3204 "parse.y"
 { yyval.ttype = reparse_decl_as_expr (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ;
     break;}
 case 603:
-#line 3198 "parse.y"
+#line 3206 "parse.y"
 { yyval.ttype = reparse_absdcl_as_expr (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 608:
-#line 3210 "parse.y"
+#line 3218 "parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 609:
-#line 3217 "parse.y"
+#line 3225 "parse.y"
 {
                  if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE)
                    {
@@ -7140,7 +7148,7 @@ case 609:
                ;
     break;}
 case 610:
-#line 3231 "parse.y"
+#line 3239 "parse.y"
 {
                  if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE)
                    yyval.ttype = lastiddecl;
@@ -7148,7 +7156,7 @@ case 610:
                ;
     break;}
 case 611:
-#line 3237 "parse.y"
+#line 3245 "parse.y"
 {
                  if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE)
                    yyval.ttype = lastiddecl;
@@ -7156,15 +7164,15 @@ case 611:
                ;
     break;}
 case 612:
-#line 3243 "parse.y"
+#line 3251 "parse.y"
 { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyvsp[-1].ttype)); ;
     break;}
 case 614:
-#line 3259 "parse.y"
+#line 3267 "parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 615:
-#line 3264 "parse.y"
+#line 3272 "parse.y"
 {
                  if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)) == 't')
                    yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype);
@@ -7179,14 +7187,14 @@ case 615:
                ;
     break;}
 case 616:
-#line 3280 "parse.y"
+#line 3288 "parse.y"
 {
                  if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE)
                    cp_error ("`%T' is not a class or namespace", yyvsp[0].ttype);
                ;
     break;}
 case 617:
-#line 3285 "parse.y"
+#line 3293 "parse.y"
 {
                  if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)) == 't')
                    yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype);
@@ -7201,7 +7209,7 @@ case 617:
                ;
     break;}
 case 618:
-#line 3301 "parse.y"
+#line 3309 "parse.y"
 {
                  if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE)
                    yyval.ttype = lastiddecl;
@@ -7209,7 +7217,7 @@ case 618:
                ;
     break;}
 case 619:
-#line 3307 "parse.y"
+#line 3315 "parse.y"
 {
                  if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE)
                    yyval.ttype = lastiddecl;
@@ -7217,11 +7225,11 @@ case 619:
                ;
     break;}
 case 620:
-#line 3313 "parse.y"
+#line 3321 "parse.y"
 { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyval.ttype)); ;
     break;}
 case 623:
-#line 3317 "parse.y"
+#line 3325 "parse.y"
 {
                  if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE)
                    yyval.ttype = lastiddecl;
@@ -7229,7 +7237,7 @@ case 623:
                ;
     break;}
 case 624:
-#line 3326 "parse.y"
+#line 3334 "parse.y"
 {
                  if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE)
                    yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype);
@@ -7239,156 +7247,156 @@ case 624:
                ;
     break;}
 case 626:
-#line 3335 "parse.y"
+#line 3343 "parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 627:
-#line 3340 "parse.y"
+#line 3348 "parse.y"
 { got_scope = NULL_TREE; ;
     break;}
 case 628:
-#line 3342 "parse.y"
+#line 3350 "parse.y"
 { yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ;
     break;}
 case 629:
-#line 3349 "parse.y"
+#line 3357 "parse.y"
 { got_scope = void_type_node; ;
     break;}
 case 630:
-#line 3355 "parse.y"
+#line 3363 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 631:
-#line 3357 "parse.y"
+#line 3365 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 632:
-#line 3359 "parse.y"
+#line 3367 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 633:
-#line 3361 "parse.y"
+#line 3369 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 634:
-#line 3363 "parse.y"
+#line 3371 "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 635:
-#line 3367 "parse.y"
+#line 3375 "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 637:
-#line 3376 "parse.y"
+#line 3384 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ;
     break;}
 case 638:
-#line 3378 "parse.y"
+#line 3386 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ;
     break;}
 case 639:
-#line 3384 "parse.y"
+#line 3392 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 640:
-#line 3386 "parse.y"
+#line 3394 "parse.y"
 { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 641:
-#line 3388 "parse.y"
+#line 3396 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[0].ftype.t, NULL_TREE); ;
     break;}
 case 642:
-#line 3390 "parse.y"
+#line 3398 "parse.y"
 { yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ;
     break;}
 case 643:
-#line 3392 "parse.y"
+#line 3400 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 644:
-#line 3394 "parse.y"
+#line 3402 "parse.y"
 { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 645:
-#line 3396 "parse.y"
+#line 3404 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[0].ftype.t, NULL_TREE); ;
     break;}
 case 646:
-#line 3398 "parse.y"
+#line 3406 "parse.y"
 { yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ;
     break;}
 case 647:
-#line 3400 "parse.y"
+#line 3408 "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 648:
-#line 3404 "parse.y"
+#line 3412 "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 650:
-#line 3413 "parse.y"
+#line 3421 "parse.y"
 { yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 652:
-#line 3417 "parse.y"
+#line 3425 "parse.y"
 { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 653:
-#line 3419 "parse.y"
+#line 3427 "parse.y"
 { yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 654:
-#line 3421 "parse.y"
+#line 3429 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ;
     break;}
 case 655:
-#line 3423 "parse.y"
+#line 3431 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ;
     break;}
 case 656:
-#line 3425 "parse.y"
+#line 3433 "parse.y"
 { yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 657:
-#line 3427 "parse.y"
+#line 3435 "parse.y"
 { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 658:
-#line 3429 "parse.y"
+#line 3437 "parse.y"
 { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 659:
-#line 3431 "parse.y"
+#line 3439 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ;
     break;}
 case 660:
-#line 3433 "parse.y"
+#line 3441 "parse.y"
 { yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); ;
     break;}
 case 666:
-#line 3457 "parse.y"
+#line 3465 "parse.y"
 { do_pushlevel (); ;
     break;}
 case 667:
-#line 3462 "parse.y"
+#line 3470 "parse.y"
 { yyval.ttype = do_poplevel (); ;
     break;}
 case 669:
-#line 3470 "parse.y"
+#line 3478 "parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C++ forbids label declarations"); ;
     break;}
 case 672:
-#line 3481 "parse.y"
+#line 3489 "parse.y"
 { tree link;
                  for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link))
                    {
@@ -7399,11 +7407,11 @@ case 672:
                ;
     break;}
 case 673:
-#line 3495 "parse.y"
+#line 3503 "parse.y"
 {;
     break;}
 case 675:
-#line 3501 "parse.y"
+#line 3509 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7413,7 +7421,7 @@ case 675:
                ;
     break;}
 case 676:
-#line 3509 "parse.y"
+#line 3517 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7425,7 +7433,7 @@ case 676:
                ;
     break;}
 case 677:
-#line 3522 "parse.y"
+#line 3530 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7437,7 +7445,7 @@ case 677:
                ;
     break;}
 case 678:
-#line 3532 "parse.y"
+#line 3540 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7458,7 +7466,7 @@ case 678:
                ;
     break;}
 case 679:
-#line 3551 "parse.y"
+#line 3559 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7469,11 +7477,11 @@ case 679:
                ;
     break;}
 case 680:
-#line 3563 "parse.y"
+#line 3571 "parse.y"
 { finish_stmt (); ;
     break;}
 case 681:
-#line 3565 "parse.y"
+#line 3573 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7483,7 +7491,7 @@ case 681:
                ;
     break;}
 case 682:
-#line 3573 "parse.y"
+#line 3581 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7495,15 +7503,15 @@ case 682:
                ;
     break;}
 case 683:
-#line 3586 "parse.y"
+#line 3594 "parse.y"
 { finish_stmt (); ;
     break;}
 case 685:
-#line 3592 "parse.y"
+#line 3600 "parse.y"
 { finish_stmt (); ;
     break;}
 case 686:
-#line 3594 "parse.y"
+#line 3602 "parse.y"
 {
                  tree expr = yyvsp[-1].ttype;
                  if (! processing_template_decl)
@@ -7521,11 +7529,11 @@ case 686:
                  finish_stmt (); ;
     break;}
 case 687:
-#line 3610 "parse.y"
+#line 3618 "parse.y"
 { if (! processing_template_decl) expand_start_else (); ;
     break;}
 case 688:
-#line 3612 "parse.y"
+#line 3620 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7538,17 +7546,17 @@ case 688:
                ;
     break;}
 case 689:
-#line 3623 "parse.y"
+#line 3631 "parse.y"
 { finish_stmt (); ;
     break;}
 case 690:
-#line 3625 "parse.y"
+#line 3633 "parse.y"
 { if (! processing_template_decl) expand_end_cond ();
                  do_poplevel ();
                  finish_stmt (); ;
     break;}
 case 691:
-#line 3629 "parse.y"
+#line 3637 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7565,7 +7573,7 @@ case 691:
                ;
     break;}
 case 692:
-#line 3644 "parse.y"
+#line 3652 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7586,7 +7594,7 @@ case 692:
                ;
     break;}
 case 693:
-#line 3663 "parse.y"
+#line 3671 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7600,7 +7608,7 @@ case 693:
                ;
     break;}
 case 694:
-#line 3675 "parse.y"
+#line 3683 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7616,7 +7624,7 @@ case 694:
                ;
     break;}
 case 695:
-#line 3689 "parse.y"
+#line 3697 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7632,7 +7640,7 @@ case 695:
                ;
     break;}
 case 696:
-#line 3703 "parse.y"
+#line 3711 "parse.y"
 {
                  if (processing_template_decl)
                    TREE_OPERAND (yyvsp[-5].ttype, 1) = yyvsp[-1].ttype;
@@ -7647,7 +7655,7 @@ case 696:
                ;
     break;}
 case 697:
-#line 3716 "parse.y"
+#line 3724 "parse.y"
 { if (processing_template_decl)
                    {
                      yyval.ttype = build_min_nt (FOR_STMT, NULL_TREE, NULL_TREE, 
@@ -7668,7 +7676,7 @@ case 697:
                ;
     break;}
 case 698:
-#line 3735 "parse.y"
+#line 3743 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7688,7 +7696,7 @@ case 698:
                ;
     break;}
 case 699:
-#line 3753 "parse.y"
+#line 3761 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7709,7 +7717,7 @@ case 699:
                ;
     break;}
 case 700:
-#line 3774 "parse.y"
+#line 3782 "parse.y"
 {
                  if (processing_template_decl)
                    TREE_OPERAND (yyvsp[-9].ttype, 2) = yyvsp[-1].ttype;
@@ -7717,7 +7725,7 @@ case 700:
                ;
     break;}
 case 701:
-#line 3780 "parse.y"
+#line 3788 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7740,7 +7748,7 @@ case 701:
                  finish_stmt (); ;
     break;}
 case 702:
-#line 3801 "parse.y"
+#line 3809 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7759,7 +7767,7 @@ case 702:
                ;
     break;}
 case 703:
-#line 3818 "parse.y"
+#line 3826 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7774,23 +7782,23 @@ case 703:
                ;
     break;}
 case 704:
-#line 3831 "parse.y"
+#line 3839 "parse.y"
 { finish_stmt (); ;
     break;}
 case 705:
-#line 3833 "parse.y"
+#line 3841 "parse.y"
 { do_case (yyvsp[-1].ttype, NULL_TREE); ;
     break;}
 case 707:
-#line 3836 "parse.y"
+#line 3844 "parse.y"
 { do_case (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 709:
-#line 3839 "parse.y"
+#line 3847 "parse.y"
 { do_case (NULL_TREE, NULL_TREE); ;
     break;}
 case 711:
-#line 3842 "parse.y"
+#line 3850 "parse.y"
 { emit_line_note (input_filename, lineno);
                  if (processing_template_decl)
                    add_tree (build_min_nt (BREAK_STMT));
@@ -7798,7 +7806,7 @@ case 711:
                    error ("break statement not within loop or switch"); ;
     break;}
 case 712:
-#line 3848 "parse.y"
+#line 3856 "parse.y"
 { emit_line_note (input_filename, lineno);
                  if (processing_template_decl)
                    add_tree (build_min_nt (CONTINUE_STMT));
@@ -7806,19 +7814,19 @@ case 712:
                    error ("continue statement not within a loop"); ;
     break;}
 case 713:
-#line 3854 "parse.y"
+#line 3862 "parse.y"
 { emit_line_note (input_filename, lineno);
                  c_expand_return (NULL_TREE); ;
     break;}
 case 714:
-#line 3857 "parse.y"
+#line 3865 "parse.y"
 { emit_line_note (input_filename, lineno);
                  c_expand_return (yyvsp[-1].ttype);
                  finish_stmt ();
                ;
     break;}
 case 715:
-#line 3862 "parse.y"
+#line 3870 "parse.y"
 { if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype);
                  emit_line_note (input_filename, lineno);
                  expand_asm (yyvsp[-2].ttype);
@@ -7826,7 +7834,7 @@ case 715:
                ;
     break;}
 case 716:
-#line 3869 "parse.y"
+#line 3877 "parse.y"
 { if (TREE_CHAIN (yyvsp[-4].ttype)) yyvsp[-4].ttype = combine_strings (yyvsp[-4].ttype);
                  emit_line_note (input_filename, lineno);
                  c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE,
@@ -7836,7 +7844,7 @@ case 716:
                ;
     break;}
 case 717:
-#line 3878 "parse.y"
+#line 3886 "parse.y"
 { if (TREE_CHAIN (yyvsp[-6].ttype)) yyvsp[-6].ttype = combine_strings (yyvsp[-6].ttype);
                  emit_line_note (input_filename, lineno);
                  c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE,
@@ -7846,7 +7854,7 @@ case 717:
                ;
     break;}
 case 718:
-#line 3888 "parse.y"
+#line 3896 "parse.y"
 { if (TREE_CHAIN (yyvsp[-8].ttype)) yyvsp[-8].ttype = combine_strings (yyvsp[-8].ttype);
                  emit_line_note (input_filename, lineno);
                  c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype,
@@ -7856,7 +7864,7 @@ case 718:
                ;
     break;}
 case 719:
-#line 3896 "parse.y"
+#line 3904 "parse.y"
 {
                  if (processing_template_decl)
                    add_tree (build_min_nt (GOTO_STMT, yyvsp[-1].ttype));
@@ -7866,7 +7874,7 @@ case 719:
                ;
     break;}
 case 720:
-#line 3904 "parse.y"
+#line 3912 "parse.y"
 {
                  if (processing_template_decl)
                    add_tree (build_min_nt (GOTO_STMT, yyvsp[-1].ttype));
@@ -7881,21 +7889,21 @@ case 720:
                ;
     break;}
 case 721:
-#line 3917 "parse.y"
+#line 3925 "parse.y"
 { finish_stmt (); ;
     break;}
 case 722:
-#line 3919 "parse.y"
+#line 3927 "parse.y"
 { error ("label must be followed by statement");
                  yyungetc ('}', 0);
                  finish_stmt (); ;
     break;}
 case 723:
-#line 3923 "parse.y"
+#line 3931 "parse.y"
 { finish_stmt (); ;
     break;}
 case 725:
-#line 3929 "parse.y"
+#line 3937 "parse.y"
 {
                  if (! current_function_parms_stored)
                    store_parm_decls ();
@@ -7903,11 +7911,11 @@ case 725:
                ;
     break;}
 case 726:
-#line 3935 "parse.y"
+#line 3943 "parse.y"
 { expand_start_all_catch (); ;
     break;}
 case 727:
-#line 3937 "parse.y"
+#line 3945 "parse.y"
 {
                  int nested = (hack_decl_function_context
                                (current_function_decl) != NULL_TREE);
@@ -7916,7 +7924,7 @@ case 727:
                ;
     break;}
 case 728:
-#line 3947 "parse.y"
+#line 3955 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7932,7 +7940,7 @@ case 728:
                ;
     break;}
 case 729:
-#line 3961 "parse.y"
+#line 3969 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7945,7 +7953,7 @@ case 729:
                ;
     break;}
 case 730:
-#line 3972 "parse.y"
+#line 3980 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7958,7 +7966,7 @@ case 730:
                ;
     break;}
 case 733:
-#line 3991 "parse.y"
+#line 3999 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7969,7 +7977,7 @@ case 733:
                ;
     break;}
 case 734:
-#line 4000 "parse.y"
+#line 4008 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7980,7 +7988,7 @@ case 734:
                ;
     break;}
 case 735:
-#line 4009 "parse.y"
+#line 4017 "parse.y"
 {
                  if (processing_template_decl)
                    {
@@ -7993,17 +8001,17 @@ case 735:
                ;
     break;}
 case 739:
-#line 4029 "parse.y"
+#line 4037 "parse.y"
 { expand_start_catch_block (NULL_TREE, NULL_TREE); ;
     break;}
 case 740:
-#line 4045 "parse.y"
+#line 4053 "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 741:
-#line 4052 "parse.y"
+#line 4060 "parse.y"
 { tree label;
                do_label:
                  label = define_label (input_filename, lineno, yyvsp[-1].ttype);
@@ -8012,129 +8020,129 @@ case 741:
                ;
     break;}
 case 742:
-#line 4059 "parse.y"
+#line 4067 "parse.y"
 { goto do_label; ;
     break;}
 case 743:
-#line 4061 "parse.y"
+#line 4069 "parse.y"
 { goto do_label; ;
     break;}
 case 744:
-#line 4063 "parse.y"
+#line 4071 "parse.y"
 { goto do_label; ;
     break;}
 case 745:
-#line 4068 "parse.y"
+#line 4076 "parse.y"
 { if (yyvsp[-1].ttype) cplus_expand_expr_stmt (yyvsp[-1].ttype); ;
     break;}
 case 747:
-#line 4071 "parse.y"
+#line 4079 "parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C++ forbids compound statements inside for initializations");
                ;
     break;}
 case 748:
-#line 4080 "parse.y"
+#line 4088 "parse.y"
 { emit_line_note (input_filename, lineno);
                  yyval.ttype = NULL_TREE; ;
     break;}
 case 749:
-#line 4083 "parse.y"
+#line 4091 "parse.y"
 { emit_line_note (input_filename, lineno); ;
     break;}
 case 750:
-#line 4088 "parse.y"
+#line 4096 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 752:
-#line 4091 "parse.y"
+#line 4099 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 753:
-#line 4098 "parse.y"
+#line 4106 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 756:
-#line 4105 "parse.y"
+#line 4113 "parse.y"
 { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ;
     break;}
 case 757:
-#line 4110 "parse.y"
+#line 4118 "parse.y"
 { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ;
     break;}
 case 758:
-#line 4115 "parse.y"
+#line 4123 "parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, NULL_TREE); ;
     break;}
 case 759:
-#line 4117 "parse.y"
+#line 4125 "parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ;
     break;}
 case 760:
-#line 4128 "parse.y"
+#line 4136 "parse.y"
 {
                  yyval.ttype = empty_parms();
                ;
     break;}
 case 762:
-#line 4133 "parse.y"
+#line 4141 "parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ftype.t, void_list_node);
                  TREE_PARMLIST (yyval.ttype) = 1; 
                  check_for_new_type ("inside parameter list", yyvsp[0].ftype); ;
     break;}
 case 763:
-#line 4142 "parse.y"
+#line 4150 "parse.y"
 {
                  yyval.ttype = chainon (yyval.ttype, void_list_node);
                  TREE_PARMLIST (yyval.ttype) = 1;
                ;
     break;}
 case 764:
-#line 4147 "parse.y"
+#line 4155 "parse.y"
 {
                  TREE_PARMLIST (yyval.ttype) = 1;
                ;
     break;}
 case 765:
-#line 4152 "parse.y"
+#line 4160 "parse.y"
 {
                  TREE_PARMLIST (yyval.ttype) = 1;
                ;
     break;}
 case 766:
-#line 4156 "parse.y"
+#line 4164 "parse.y"
 {
                  yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); 
                  TREE_PARMLIST (yyval.ttype) = 1;
                ;
     break;}
 case 767:
-#line 4161 "parse.y"
+#line 4169 "parse.y"
 {
                  yyval.ttype = NULL_TREE;
                ;
     break;}
 case 768:
-#line 4165 "parse.y"
+#line 4173 "parse.y"
 {
                  TREE_PARMLIST (yyval.ttype) = 1;
                ;
     break;}
 case 769:
-#line 4169 "parse.y"
+#line 4177 "parse.y"
 {
                  TREE_PARMLIST (yyval.ttype) = 1;
                ;
     break;}
 case 770:
-#line 4173 "parse.y"
+#line 4181 "parse.y"
 {
                  yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t);
                  TREE_PARMLIST (yyval.ttype) = 1;
                ;
     break;}
 case 771:
-#line 4178 "parse.y"
+#line 4186 "parse.y"
 {
                  /* This helps us recover from really nasty
                     parse errors, for example, a missing right
@@ -8147,7 +8155,7 @@ case 771:
                ;
     break;}
 case 772:
-#line 4189 "parse.y"
+#line 4197 "parse.y"
 {
                  /* This helps us recover from really nasty
                     parse errors, for example, a missing right
@@ -8160,98 +8168,98 @@ case 772:
                ;
     break;}
 case 773:
-#line 4204 "parse.y"
+#line 4212 "parse.y"
 { maybe_snarf_defarg (); ;
     break;}
 case 774:
-#line 4206 "parse.y"
+#line 4214 "parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 777:
-#line 4217 "parse.y"
+#line 4225 "parse.y"
 { check_for_new_type ("in a parameter list", yyvsp[0].ftype);
                  yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ;
     break;}
 case 778:
-#line 4220 "parse.y"
+#line 4228 "parse.y"
 { check_for_new_type ("in a parameter list", yyvsp[-1].ftype);
                  yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); ;
     break;}
 case 779:
-#line 4223 "parse.y"
+#line 4231 "parse.y"
 { check_for_new_type ("in a parameter list", yyvsp[0].ftype);
                  yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ;
     break;}
 case 780:
-#line 4226 "parse.y"
+#line 4234 "parse.y"
 { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
     break;}
 case 781:
-#line 4228 "parse.y"
+#line 4236 "parse.y"
 { yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ;
     break;}
 case 783:
-#line 4234 "parse.y"
+#line 4242 "parse.y"
 { check_for_new_type ("in a parameter list", yyvsp[-1].ftype);
                  yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); ;
     break;}
 case 784:
-#line 4244 "parse.y"
+#line 4252 "parse.y"
 { tree specs = strip_attrs (yyvsp[-1].ftype.t);
                  yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag;
                  yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); ;
     break;}
 case 785:
-#line 4248 "parse.y"
+#line 4256 "parse.y"
 { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); 
                  yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
     break;}
 case 786:
-#line 4251 "parse.y"
+#line 4259 "parse.y"
 { yyval.ftype.t = build_tree_list (get_decl_list (yyvsp[-1].ftype.t), yyvsp[0].ttype); 
                  yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
     break;}
 case 787:
-#line 4254 "parse.y"
+#line 4262 "parse.y"
 { tree specs = strip_attrs (yyvsp[-1].ftype.t);
                  yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype);
                  yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
     break;}
 case 788:
-#line 4258 "parse.y"
+#line 4266 "parse.y"
 { tree specs = strip_attrs (yyvsp[0].ftype.t);
                  yyval.ftype.t = build_tree_list (specs, NULL_TREE); 
                  yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ;
     break;}
 case 789:
-#line 4262 "parse.y"
+#line 4270 "parse.y"
 { tree specs = strip_attrs (yyvsp[-1].ttype);
                  yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); 
                  yyval.ftype.new_type_flag = 0; ;
     break;}
 case 790:
-#line 4269 "parse.y"
+#line 4277 "parse.y"
 { yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t);
                  yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag;  ;
     break;}
 case 791:
-#line 4272 "parse.y"
+#line 4280 "parse.y"
 { yyval.ftype.t = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t);
                  yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag;  ;
     break;}
 case 794:
-#line 4283 "parse.y"
+#line 4291 "parse.y"
 { see_typename (); ;
     break;}
 case 795:
-#line 4288 "parse.y"
+#line 4296 "parse.y"
 {
                  error ("type specifier omitted for parameter");
                  yyval.ttype = build_tree_list (integer_type_node, NULL_TREE);
                ;
     break;}
 case 796:
-#line 4293 "parse.y"
+#line 4301 "parse.y"
 {
                  error ("type specifier omitted for parameter");
                  if (TREE_CODE (yyval.ttype) == SCOPE_REF
@@ -8262,188 +8270,188 @@ case 796:
                ;
     break;}
 case 797:
-#line 4305 "parse.y"
+#line 4313 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 798:
-#line 4307 "parse.y"
+#line 4315 "parse.y"
 { yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 799:
-#line 4309 "parse.y"
+#line 4317 "parse.y"
 { yyval.ttype = build_decl_list (NULL_TREE, NULL_TREE); ;
     break;}
 case 800:
-#line 4314 "parse.y"
+#line 4322 "parse.y"
 { yyval.ttype = build_decl_list (NULL_TREE, groktypename(yyvsp[0].ftype.t)); ;
     break;}
 case 802:
-#line 4320 "parse.y"
+#line 4328 "parse.y"
 {
                  TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype;
                  yyval.ttype = yyvsp[0].ttype;
                ;
     break;}
 case 803:
-#line 4328 "parse.y"
+#line 4336 "parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 804:
-#line 4330 "parse.y"
+#line 4338 "parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 805:
-#line 4332 "parse.y"
+#line 4340 "parse.y"
 { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 806:
-#line 4334 "parse.y"
+#line 4342 "parse.y"
 { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype);
                  yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg);
                ;
     break;}
 case 807:
-#line 4341 "parse.y"
+#line 4349 "parse.y"
 { got_scope = NULL_TREE; ;
     break;}
 case 808:
-#line 4346 "parse.y"
+#line 4354 "parse.y"
 { yyval.ttype = ansi_opname[MULT_EXPR]; ;
     break;}
 case 809:
-#line 4348 "parse.y"
+#line 4356 "parse.y"
 { yyval.ttype = ansi_opname[TRUNC_DIV_EXPR]; ;
     break;}
 case 810:
-#line 4350 "parse.y"
+#line 4358 "parse.y"
 { yyval.ttype = ansi_opname[TRUNC_MOD_EXPR]; ;
     break;}
 case 811:
-#line 4352 "parse.y"
+#line 4360 "parse.y"
 { yyval.ttype = ansi_opname[PLUS_EXPR]; ;
     break;}
 case 812:
-#line 4354 "parse.y"
+#line 4362 "parse.y"
 { yyval.ttype = ansi_opname[MINUS_EXPR]; ;
     break;}
 case 813:
-#line 4356 "parse.y"
+#line 4364 "parse.y"
 { yyval.ttype = ansi_opname[BIT_AND_EXPR]; ;
     break;}
 case 814:
-#line 4358 "parse.y"
+#line 4366 "parse.y"
 { yyval.ttype = ansi_opname[BIT_IOR_EXPR]; ;
     break;}
 case 815:
-#line 4360 "parse.y"
+#line 4368 "parse.y"
 { yyval.ttype = ansi_opname[BIT_XOR_EXPR]; ;
     break;}
 case 816:
-#line 4362 "parse.y"
+#line 4370 "parse.y"
 { yyval.ttype = ansi_opname[BIT_NOT_EXPR]; ;
     break;}
 case 817:
-#line 4364 "parse.y"
+#line 4372 "parse.y"
 { yyval.ttype = ansi_opname[COMPOUND_EXPR]; ;
     break;}
 case 818:
-#line 4366 "parse.y"
+#line 4374 "parse.y"
 { yyval.ttype = ansi_opname[yyvsp[0].code]; ;
     break;}
 case 819:
-#line 4368 "parse.y"
+#line 4376 "parse.y"
 { yyval.ttype = ansi_opname[LT_EXPR]; ;
     break;}
 case 820:
-#line 4370 "parse.y"
+#line 4378 "parse.y"
 { yyval.ttype = ansi_opname[GT_EXPR]; ;
     break;}
 case 821:
-#line 4372 "parse.y"
+#line 4380 "parse.y"
 { yyval.ttype = ansi_opname[yyvsp[0].code]; ;
     break;}
 case 822:
-#line 4374 "parse.y"
+#line 4382 "parse.y"
 { yyval.ttype = ansi_assopname[yyvsp[0].code]; ;
     break;}
 case 823:
-#line 4376 "parse.y"
+#line 4384 "parse.y"
 { yyval.ttype = ansi_opname [MODIFY_EXPR]; ;
     break;}
 case 824:
-#line 4378 "parse.y"
+#line 4386 "parse.y"
 { yyval.ttype = ansi_opname[yyvsp[0].code]; ;
     break;}
 case 825:
-#line 4380 "parse.y"
+#line 4388 "parse.y"
 { yyval.ttype = ansi_opname[yyvsp[0].code]; ;
     break;}
 case 826:
-#line 4382 "parse.y"
+#line 4390 "parse.y"
 { yyval.ttype = ansi_opname[POSTINCREMENT_EXPR]; ;
     break;}
 case 827:
-#line 4384 "parse.y"
+#line 4392 "parse.y"
 { yyval.ttype = ansi_opname[PREDECREMENT_EXPR]; ;
     break;}
 case 828:
-#line 4386 "parse.y"
+#line 4394 "parse.y"
 { yyval.ttype = ansi_opname[TRUTH_ANDIF_EXPR]; ;
     break;}
 case 829:
-#line 4388 "parse.y"
+#line 4396 "parse.y"
 { yyval.ttype = ansi_opname[TRUTH_ORIF_EXPR]; ;
     break;}
 case 830:
-#line 4390 "parse.y"
+#line 4398 "parse.y"
 { yyval.ttype = ansi_opname[TRUTH_NOT_EXPR]; ;
     break;}
 case 831:
-#line 4392 "parse.y"
+#line 4400 "parse.y"
 { yyval.ttype = ansi_opname[COND_EXPR]; ;
     break;}
 case 832:
-#line 4394 "parse.y"
+#line 4402 "parse.y"
 { yyval.ttype = ansi_opname[yyvsp[0].code]; ;
     break;}
 case 833:
-#line 4396 "parse.y"
+#line 4404 "parse.y"
 { yyval.ttype = ansi_opname[COMPONENT_REF]; ;
     break;}
 case 834:
-#line 4398 "parse.y"
+#line 4406 "parse.y"
 { yyval.ttype = ansi_opname[MEMBER_REF]; ;
     break;}
 case 835:
-#line 4400 "parse.y"
+#line 4408 "parse.y"
 { yyval.ttype = ansi_opname[CALL_EXPR]; ;
     break;}
 case 836:
-#line 4402 "parse.y"
+#line 4410 "parse.y"
 { yyval.ttype = ansi_opname[ARRAY_REF]; ;
     break;}
 case 837:
-#line 4404 "parse.y"
+#line 4412 "parse.y"
 { yyval.ttype = ansi_opname[NEW_EXPR]; ;
     break;}
 case 838:
-#line 4406 "parse.y"
+#line 4414 "parse.y"
 { yyval.ttype = ansi_opname[DELETE_EXPR]; ;
     break;}
 case 839:
-#line 4408 "parse.y"
+#line 4416 "parse.y"
 { yyval.ttype = ansi_opname[VEC_NEW_EXPR]; ;
     break;}
 case 840:
-#line 4410 "parse.y"
+#line 4418 "parse.y"
 { yyval.ttype = ansi_opname[VEC_DELETE_EXPR]; ;
     break;}
 case 841:
-#line 4413 "parse.y"
+#line 4421 "parse.y"
 { yyval.ttype = grokoptypename (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
     break;}
 case 842:
-#line 4415 "parse.y"
+#line 4423 "parse.y"
 { yyval.ttype = ansi_opname[ERROR_MARK]; ;
     break;}
 }
@@ -8644,7 +8652,7 @@ yyerrhandle:
   yystate = yyn;
   goto yynewstate;
 }
-#line 4418 "parse.y"
+#line 4426 "parse.y"
 
 
 #ifdef SPEW_DEBUG
index 22dc376d2e05e90b609de64afc94e27d6a996d45..13a728b111c1242f9ad9bb520d0782f5762121c1 100644 (file)
@@ -2355,13 +2355,21 @@ structsp:
                }
        | class_head  %prec EMPTY
                {
-                 $$.t = $1;
                  $$.new_type_flag = 0;
-                 /* struct B: public A; is not accepted by the WP grammar.  */
-                 if (TYPE_BINFO_BASETYPES ($$.t) && !TYPE_SIZE ($$.t)
-                     && ! TYPE_BEING_DEFINED ($$.t))
-                   cp_error ("base clause without member specification for `%#T'",
-                             $$.t);
+                 if (TYPE_BINFO ($1) == NULL_TREE)
+                   {
+                     cp_error ("%T is not a class type", $1);
+                     $$.t = error_mark_node;
+                   } 
+                 else
+                   {
+                     $$.t = $1;
+                     /* struct B: public A; is not accepted by the WP grammar.  */
+                     if (TYPE_BINFO_BASETYPES ($$.t) && !TYPE_SIZE ($$.t)
+                         && ! TYPE_BEING_DEFINED ($$.t))
+                       cp_error ("base clause without member specification for `%#T'",
+                                 $$.t);
+                   }
                }
        ;
 
index a4c51dc7c36afc0dc105b130a3b63d7888f5a300..8a1620370c876b6dfeca2a9732162d33146fdea1 100644 (file)
@@ -1498,6 +1498,14 @@ convert_nontype_argument (type, expr)
         just converting one integral constant expression to another.  */
       return digest_init (type, expr, (tree*) 0);
 
+    case REAL_TYPE:
+    case COMPLEX_TYPE:
+      /* These are g++ extensions.  */
+      if (TREE_CODE (expr_type) != TREE_CODE (type))
+       return error_mark_node;
+
+      return digest_init (type, expr, (tree*) 0);
+
     case POINTER_TYPE:
       {
        tree type_pointed_to = TREE_TYPE (type);
@@ -2539,12 +2547,15 @@ uses_template_parms (t)
     case CONST_CAST_EXPR:
     case STATIC_CAST_EXPR:
     case DYNAMIC_CAST_EXPR:
-    case SIZEOF_EXPR:
     case ARROW_EXPR:
     case DOTSTAR_EXPR:
     case TYPEID_EXPR:
       return 1;
 
+    case SIZEOF_EXPR:
+    case ALIGNOF_EXPR:
+      return uses_template_parms (TREE_OPERAND (t, 0));
+
     default:
       switch (TREE_CODE_CLASS (TREE_CODE (t)))
        {
@@ -4004,6 +4015,7 @@ tsubst_copy (t, args, nargs, in_decl)
     case ADDR_EXPR:
     case CONVERT_EXPR:      /* Unary + */
     case SIZEOF_EXPR:
+    case ALIGNOF_EXPR:
     case ARROW_EXPR:
     case THROW_EXPR:
     case TYPEID_EXPR:
index 94fa1ea2432b3b60c9cd04bb434623025b38dfa8..16bcb1357351fc98a265e44b59c2ac70fed97d3a 100644 (file)
@@ -2074,6 +2074,7 @@ cp_tree_equal (t1, t2)
        && TEMPLATE_CONST_LEVEL (t1) == TEMPLATE_CONST_LEVEL (t2);
 
     case SIZEOF_EXPR:
+    case ALIGNOF_EXPR:
       if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
        return 0;
       if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
index 80795d9be983d9c942ab3339eda4d302aa8b08fd..5009644eabbf4e72956c3689eee91952b6acc06b 100644 (file)
@@ -1474,6 +1474,9 @@ c_alignof (type)
   enum tree_code code = TREE_CODE (type);
   tree t;
 
+  if (processing_template_decl)
+    return build_min (ALIGNOF_EXPR, sizetype, type);
+
   if (code == FUNCTION_TYPE || code == METHOD_TYPE)
     return size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);