On 05/10/09 11:20, cppljevans at suddenlink dot net wrote:
When compile trysto expand:

  : seq
  < integral_c
    < Integral
    , Vals
    >...

the error diagnostic prints integral_c<T, val> instead of integral_c<Integral,Vals>. The integral_constant template
is derived from integral_c and does have T and val args:

struct integral_constant:public mpl::integral_c < T, val >

However, when that is replaced with:

struct integral_constant;//:public mpl::integral_c < T, val >

Compilation succeeds.



When cp_tree_equal in cp/tree.c at around line 1903 is changed to:

    case TEMPLATE_PARM_INDEX:
      {
        if (TEMPLATE_PARM_IDX (t1) != TEMPLATE_PARM_IDX (t2)) return false;
        if (TEMPLATE_PARM_LEVEL (t1) != TEMPLATE_PARM_LEVEL (t2)) return false;
      #if 1
        if (TEMPLATE_PARM_PARAMETER_PACK (t1) != TEMPLATE_PARM_PARAMETER_PACK 
(t2)) return false;
      #endif
        return same_type_p ( TREE_TYPE (TEMPLATE_PARM_DECL (t1)),
                             TREE_TYPE (TEMPLATE_PARM_DECL (t2)));
      }


the test passes.  Apparently, when the test:

          if (comp_template_args (TREE_PURPOSE (spec), args))

at around line pt.c:962 is executed, it passes when it shouldn't
and selects a previous instantiation with different value for
TEMPLATE_PARM_PARAMETER_PACK.  This different instantiation leads
to the failure of the test in:

      if (TEMPLATE_PARM_PARAMETER_PACK (t))
        parameter_pack_p = true;

at round pt.c:2463 which causes the error message.

Reply via email to