aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8.1/gcc/testsuite/g++.dg/template/typedef37.C
blob: eefa38316ca60fb4323479946930ba52f7142ab7 (plain)
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;
}