annotate gcc/testsuite/g++.old-deja/g++.jason/template36.C @ 131:84e7813d76e9

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