comparison gcc/testsuite/g++.dg/ipa/pr82352.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
comparison
equal deleted inserted replaced
111:04ced10e8804 131:84e7813d76e9
1 // PR ipa/82352
2 // { dg-do compile }
3 // { dg-options "-O2" }
4
5 typedef __SIZE_TYPE__ size_t;
6
7 class A
8 {
9 public :
10 typedef enum { Zero = 0, One = 1 } tA;
11 A(tA a) { m_a = a; }
12
13 private :
14 tA m_a;
15 };
16
17 class B
18 {
19 public :
20 void *operator new(size_t t) { return (void*)(42); };
21 };
22
23 class C
24 {
25 public:
26 virtual void ffff () = 0;
27 };
28
29 class D
30 {
31 public :
32 virtual void g() = 0;
33 virtual void h() = 0;
34 };
35
36 template<class T> class IIII: public T, public D
37 {
38 public:
39 void ffff()
40 {
41 if (!m_i2) throw A(A::One);
42 };
43
44 void h()
45 {
46 if (m_i2) throw A(A::Zero);
47 }
48
49 protected:
50 virtual void g()
51 {
52 if (m_i1 !=0) throw A(A::Zero);
53 };
54
55 private :
56 int m_i1;
57 void *m_i2;
58 };
59
60 class E
61 {
62 private:
63 size_t m_e;
64 static const size_t Max;
65
66 public:
67 E& i(size_t a, size_t b, size_t c)
68 {
69 if ((a > Max) || (c > Max)) throw A(A::Zero );
70 if (a + b > m_e) throw A(A::One );
71 return (*this);
72 }
73
74 inline E& j(const E &s)
75 {
76 return i(0,0,s.m_e);
77 }
78 };
79
80 class F : public C { };
81 class G : public C { };
82 class HHHH : public B, public F, public G { };
83
84 void k()
85 {
86 new IIII<HHHH>();
87 }
88
89 void l()
90 {
91 E e1, e2;
92 e1.j(e2);
93 }