111
|
1 // { dg-do run }
|
|
2 // Testcase for implicit 'typename' and resolution of 'typename's in the
|
|
3 // current scope.
|
|
4
|
|
5 class base1 {
|
|
6 public:
|
|
7 int bar() const
|
|
8 { return 1; }
|
|
9 };
|
|
10
|
|
11 class base2 {
|
|
12 public:
|
|
13 int bar() const
|
|
14 { return 0; }
|
|
15 };
|
|
16
|
|
17 template<class X>
|
|
18 struct base_trait {
|
|
19 typedef base1 base;
|
|
20 };
|
|
21
|
|
22 template<>
|
|
23 struct base_trait<float> {
|
|
24 typedef base2 base;
|
|
25 };
|
|
26
|
|
27 template<class T>
|
|
28 class weird : public base_trait<T>::base {
|
|
29 public:
|
|
30 typedef typename base_trait<T>::base base;
|
|
31
|
|
32 base f ();
|
|
33 int base::* g ();
|
|
34
|
|
35 int zowee() const
|
|
36 { return this->bar(); }
|
|
37 };
|
|
38
|
|
39 template <class T>
|
|
40 typename weird<T>::base weird<T>::f ()
|
|
41 {
|
|
42 return base();
|
|
43 }
|
|
44
|
|
45 // The standard does not allow this case; the `typename' keyword may
|
|
46 // not appear in a ptr-operator.
|
|
47 #if 0
|
|
48 template <class T>
|
|
49 int typename weird<T>::base::* weird<T>::g ()
|
|
50 { return 0; }
|
|
51 #endif
|
|
52
|
|
53 int main()
|
|
54 {
|
|
55 weird<float> z;
|
|
56 return z.zowee() || z.f().bar();
|
|
57 }
|