On 11/02/09 22:39, Larry Evans wrote:
The following code around trunk/gcc/cp/pt.c:15514:
15513 partial_spec_args = INNERMOST_TEMPLATE_ARGS (partial_spec_args);
15514 partial_spec_args = tsubst_template_args
15515 (partial_spec_args, outer_args, tf_none, NULL_TREE);
as shown here:
http://gcc.gnu.org/viewcvs/trunk/gcc/cp/pt.c?view=markup&pathrev=153822
appears to substitute outer_args in the place where inner parameters
are located. Am I reading the code wrong? I ask because gdb seems to
show this happening with the following code:
--{-- test code --
struct
outer_arg0
;
struct
inner_arg0
;
struct
inner_arg1
;
//#define CLASS_SCOPE_SPECIALIZATION
template
< class OuterArg0
>
struct
outer_tmpl
{
template
< typename InnerArg0
, typename InnerArg1
>
struct
inner_tmpl
#ifndef CLASS_SCOPE_SPECIALIZATION
;
#else
{};
template
< typename InnerArg0
>
struct
inner_tmpl
< InnerArg0
, inner_arg1
>
{
typedef
InnerArg0
inner_typdef
;
};
#endif
};
#ifndef CLASS_SCOPE_SPECIALIZATION
template
< //class OuterArg0
>
template
< typename InnerArg0
>
struct
outer_tmpl
< outer_arg0
>::
inner_tmpl
< InnerArg0
, inner_arg1
>
{
typedef
InnerArg0
inner_typdef
;
};
#endif
typedef
outer_tmpl<outer_arg0>
::inner_tmpl
< inner_arg0
, inner_arg1
>
::inner_typdef //error here.
outer_inner_type
;
--}-- test code --
[snip]
Just adding an outer_tmpl specialization solves the problem:
template
<// class OuterArg0
>
struct
outer_tmpl
< outer_arg0
>
{
template
< typename InnerArg0
, typename InnerArg1
>
struct
inner_tmpl
;
};