1 // { dg-do run }
2 // GROUPS passed nested-classes
3 #include <iostream>
4 #include <cstdio>
5 #include <cstring>
6
7 static char output[1024];
8
9 class BDDRetrace {
10 public:
11 class Dump {
12 public:
13 virtual Dump& operator<<(char c) = 0;
14 virtual Dump& operator<<(int i) = 0;
15 virtual Dump& operator<<(double r) = 0;
16 };
17
18 class Dump1: public Dump {
19 public:
20 Dump& operator<<(char c);
21 Dump& operator<<(int i);
22 Dump& operator<<(double r);
23 };
24 };
25
26 class Dump2: public BDDRetrace::Dump {
27 public:
28 BDDRetrace::Dump& operator<<(char c);
29 BDDRetrace::Dump& operator<<(int i);
30 BDDRetrace::Dump& operator<<(double r);
31 };
32
33 BDDRetrace::Dump&
34 BDDRetrace::Dump1::operator<<(char c)
35 { char tempout[1024];
36 std::sprintf(tempout, "%s%s%c", output, "1-", c);
37 std::strcpy(output, tempout);
38 return *this;
39 }
40
41 BDDRetrace::Dump&
42 BDDRetrace::Dump1::operator<<(int i)
43 { char tempout[1024];
44 std::sprintf (tempout, "%s%s%d", output, "1-", i);
45 std::strcpy (output, tempout);
46 return *this; }
47
48 BDDRetrace::Dump&
49 BDDRetrace::Dump1::operator<<(double r)
50 { char tempout[1024];
51 std::sprintf (tempout, "%s%s%1.0f", output, "1-", r);
52 std::strcpy (output, tempout);
53 return *this; }
54
55 BDDRetrace::Dump&
56 Dump2::operator<<(char c)
57 { char tempout[1024];
58 std::sprintf (tempout, "%s%s%c", output, "2-", c);
59 std::strcpy (output, tempout);
60 return *this; }
61
62 BDDRetrace::Dump&
63 Dump2::operator<<(int i)
64 { char tempout[1024];
65 std::sprintf (tempout, "%s%s%d", output, "2-", i);
66 std::strcpy (output, tempout);
67 return *this; }
68
69 BDDRetrace::Dump&
70 Dump2::operator<<(double r)
71 { char tempout[1024];
72 std::sprintf (tempout, "%s%s%1.0f", output, "2-", r);
73 std::strcpy (output, tempout);
74 return *this; }
75
main()76 int main()
77 {
78 BDDRetrace::Dump1 d1;
79 Dump2 d2;
80
81 std::sprintf (output, " ");
82
83 d1 << 'a';
84 d1 << 1;
85 d1 << 1.0;
86
87 d2 << 'a';
88 d2 << 1;
89 d2 << 1.0;
90
91 if (std::strcmp (output, " 1-a1-11-12-a2-12-1") == 0)
92 std::printf ("PASS\n");
93 else
94 { std::printf ("FAIL\n"); return 1; }
95
96 return 0;
97 }
98