1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
// Origin: PR c++/47398
// { dg-do compile }
template<int>
struct A
{
typedef int INT;
};
template<int I>
struct transform
{
static int bar();
};
template<class T, int a, class U, int b>
struct B
{
typedef typename A<a>::INT TINT;
void baz();
};
template<class T, int a, class U>
struct B<T, a, U, 1>
{
typedef typename A<a>::INT TINT;
void foo();
};
template<class T, int a, class U, int b>
void
B<T, a, U, b>::baz()
{
int c = transform<sizeof(TINT)>::bar();//#0
}
template<class T, int a, class U>
void
B<T, a, U, 1>::foo()
{
int c = transform<sizeof(TINT)>::bar();//#1
}
int
main()
{
B<int, 2, char, 1> i;
i.foo();
// While instantiating
//
// template<class T, int a, class U> void B<T, a, U, 1>::foo()
//
// lookup_template_class resolves transform<sizeof(TINT)> in #1 to
// the wrong one; it picks up the one in #0 instead. This is because
// to compare the two A<a> comp_template_args uses cp_tree_equal
// that fails to consider the number of siblings of parm 'a'.
return 0;
}
|