* g++.dg/opt/pr85196.C: Fix for -std=c++17.
[official-gcc.git] / gcc / testsuite / g++.dg / opt / pr85196.C
blob744f4a4540dd8d431fc4b2e9200e24990df4f457
1 // PR target/85196
2 // Testcase by Rainer Orth <ro@gcc.gnu.org>
4 // { dg-do compile }
5 // { dg-options "-O -fpermissive -w" }
6 // { dg-additional-options "-fPIC" { target fpic } }
8 class a;
9 template <typename> class b;
10 template <typename k> class d : public b<k> {};
11 class e {};
12 void f(int);
13 template <class> class g {
14 public:
15   h();
16   a i();
18 template <> class b<e> : public g<e> {};
19 typedef (*j)(d<e>);
20 template <class k> class l {
21 public:
22   k operator->() { return 0; }
24 enum m { n, aa, o, ab, q, p };
25 inline s(m ac) {
26   switch (ac) {
27   case n:
28   case aa:
29   case p:
30     return 1;
31   case o:
32   case ab:
33     return 2;
34   }
36 class D {
37   int ad;
39 public:
40   *ae() { return &ad; }
42 class a {
43   l<D *> af;
45 public:
46   *r() { return af->ae(); }
47   t(int *c) {
48     int *w = af->ae();
49     return w == c;
50   }
52 class F : a {
53 public:
54   static int ah[];
55   static e v(F *);
56   unsigned long ai() const;
58 inline unsigned long F::ai() const {
59   m aj = r() - &ah[0];
60   return s(aj);
62 inline e F::v(F *ak) {
63   long al = ak->ai();
64   f(al);
66 template <typename> am() { return q; }
67 class an : public F {
68 public:
69   static ao(d<e> u) {
70     int *ap;
71     m aq = am<unsigned>();
72     ap = &ah[aq];
73     return u.h() && u.i().t(ap);
74   }
75   template <e ar(F *)> static as() {
76     F at;
77     ar(&at);
78   }
79   template <e ar(F *)> static au(int *, unsigned, e *) {
80     j av = ao;
81     d<e> aw;
82     if (av(aw))
83       as<ar>();
84   }
86 int *ax;
87 int ay;
88 e az;
89 ba() { an::au<an::v>(ax, ay, &az); }