Larry Evans <cppljev...@suddenlink.net> writes: > At pt.c:2462 > > http://gcc.gnu.org/viewcvs/trunk/gcc/cp/pt.c?revision=148666&view=markup > > there's: > > switch (TREE_CODE (t)) > { > case TEMPLATE_PARM_INDEX: > if (TEMPLATE_PARM_PARAMETER_PACK (t)) > parameter_pack_p = true; > break; > > In gdb, macro exp shows: > > (gdb) macro exp TEMPLATE_PARM_PARAMETER_PACK(t) > expands to: (((__extension__ ({ __typeof (t) const __t = (t); if > (((enum tree_code) (__t)->base.code) != (TEMPLATE_PARM_INDEX)) > tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, > (TEMPLATE_PARM_INDEX), 0); __t; }))->base.lang_flag_0)) > > which I don't understand because it seems to just recheck > that TREE_CODE is TEMPLATE_PARM_INDEX and if not issue an > error message(from tree_check_failed). Why is there this > redundant check for TREE_CODE(t)== TEMPLATE_PARM_INDEX? > The only useful thing it does is return t->base.lang_flag_0. > > What am I missing?
You may be missing the fact that TEMPLATE_PARM_PARAMETER_PACK only expands to code which checks t->base.code if ENABLE_TREE_CHECKING is defined. This is the default in the development sources, but not on the release branches. On release branches (or if you configure with --enable-checking=no), TEMPLATE_PARM_PARAMETER_PACK really does just return base.lang_flag_0. Or, you may be missing the fact that TEMPLATE_PARM_PARAMETER_PACK is not always called in a case where it is so very obvious that it is being called on a TEMPLATE_PARM_INDEX tree (e.g., the call in template_parameter_pack_p). Since it would always be wrong to call it on a tree which is not a TEMPLATE_PARM_INDEX, but since there is no compiler type checking (since everything has type tree) the code verifies that the macro is being used correctly. These kinds of runtime checks have caught many bugs early on and saved a lot of debugging time. Ian