1// { dg-do run  }
2// Test that binfos aren't erroneously shared between instantiations.
3
4class PK_CryptoSystem
5{
6};
7class PK_Encryptor : public virtual PK_CryptoSystem
8{
9};
10class PK_FixedLengthCryptoSystem : public virtual PK_CryptoSystem
11{
12public:
13	virtual unsigned int CipherTextLength() const =0;
14};
15class PK_FixedLengthEncryptor : public virtual PK_Encryptor, public virtual PK_FixedLengthCryptoSystem
16{
17};
18class PK_SignatureSystem
19{
20public:
21	virtual ~PK_SignatureSystem() {}
22};
23class PK_Signer : public virtual PK_SignatureSystem
24{
25public:
26	virtual void Sign() = 0;
27};
28class PK_Verifier : public virtual PK_SignatureSystem
29{
30};
31class PK_Precomputation
32{
33};
34template <class T> class
35PK_WithPrecomputation : public T, public virtual PK_Precomputation
36{
37};
38typedef PK_WithPrecomputation<PK_FixedLengthEncryptor> PKWPFLE;
39typedef PK_WithPrecomputation<PK_Signer> PKWPS;
40template <class EC> class
41ECPublicKey : public PKWPFLE
42{
43public:
44	unsigned int CipherTextLength() const { return 1; }
45	EC ec;
46};
47template <class EC>
48class ECPrivateKey : public ECPublicKey<EC>, public PKWPS
49{
50	void Sign() {}
51	int d;
52};
53template <class EC>
54class ECKEP : public ECPrivateKey<EC>
55{
56};
57class GF2NT : public PK_CryptoSystem
58{
59	int t1;
60};
61class EC2N : public PK_CryptoSystem
62{
63	GF2NT field;
64	int a;
65};
66template class ECKEP<EC2N>;
67template class ECKEP<int>;
68
69int
70main ()
71{
72  ECKEP<EC2N> foo;
73
74  return 0;
75}
76
77