Skip to content

Commit 8355819

Browse files
committed
Add test for recursive is and as
1 parent b6f8de1 commit 8355819

File tree

5 files changed

+298
-0
lines changed

5 files changed

+298
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
test: (forward v) = {
2+
std::cout << "v is empty = (v is void)$" << std::endl;
3+
std::cout << "v is std::monostate = (v is std::monostate)$" << std::endl;
4+
std::cout << "v is int = (v is int)$" << std::endl;
5+
std::cout << "v is std::optional<int> = (v is std::optional<int>)$" << std::endl;
6+
std::cout << "v is std::unique_ptr<int> = (v is std::unique_ptr<int>)$" << std::endl;
7+
std::cout << "v is std::variant<int, double> = (v is std::variant<int, double>)$" << std::endl;
8+
std::cout << "v is VA<0> = (v is VA<0>)$" << std::endl;
9+
std::cout << "v is VC = (v is VC)$" << std::endl;
10+
std::cout << "v is VD = (v is VD)$" << std::endl;
11+
std::cout << "v is *VA<0> = (v is *VA<0>)$" << std::endl;
12+
std::cout << "v is *VC = (v is *VC)$" << std::endl;
13+
std::cout << "v is *VD = (v is *VD)$" << std::endl;
14+
15+
std::cout << std::endl;
16+
}
17+
18+
set_and_test: (forward v, what, forward value) = {
19+
std::cout << "set v to (what)$" << std::endl;
20+
v = value;
21+
test(v);
22+
}
23+
24+
main: () -> int = {
25+
vc : VC = ();
26+
vd : VD = ();
27+
28+
v: std::variant<std::monostate, std::optional<int>, std::unique_ptr<int>, std::variant<int, double>, *VA<0>> = ();
29+
30+
test(v);
31+
32+
set_and_test(v, "std::optional<int>()", std::optional<int>());
33+
set_and_test(v, "std::optional<int>(42)", std::optional<int>(42));
34+
set_and_test(v, "std::unique_ptr<int>()", std::unique_ptr<int>());
35+
set_and_test(v, "std::unique_ptr<int>(44)", new<int>(44));
36+
set_and_test(v, "std::variant<int, double>(1)", std::variant<int, double>(1));
37+
set_and_test(v, "*VC", vc&);
38+
set_and_test(v, "*VD", vd&);
39+
}
40+
41+
template<int I>
42+
struct X { operator int() const { return I; } };
43+
44+
struct ThrowingConstruction {
45+
constexpr ThrowingConstruction() = default;
46+
ThrowingConstruction(int) { throw 1; }
47+
};
48+
49+
PotentiallyThrowingVariant: type == std::variant<std::monostate, ThrowingConstruction, X<0>, X<1>, X<2>>;
50+
51+
void set_to_valueless_by_exception(auto& v) try {
52+
v.template emplace<1>(42);
53+
} catch (...) {}
54+
55+
VA: @polymorphic_base <I:int> type = {}
56+
57+
VC: type = {
58+
this: VA<0>;
59+
this: VA<1>;
60+
}
61+
62+
VD: type = {
63+
this: VA<0>;
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
v is empty = true
2+
v is std::monostate = true
3+
v is int = false
4+
v is std::optional<int> = false
5+
v is std::unique_ptr<int> = false
6+
v is std::variant<int, double> = false
7+
v is VA<0> = false
8+
v is VC = false
9+
v is VD = false
10+
v is *VA<0> = false
11+
v is *VC = false
12+
v is *VD = false
13+
14+
set v to std::optional<int>()
15+
v is empty = true
16+
v is std::monostate = false
17+
v is int = false
18+
v is std::optional<int> = true
19+
v is std::unique_ptr<int> = false
20+
v is std::variant<int, double> = false
21+
v is VA<0> = false
22+
v is VC = false
23+
v is VD = false
24+
v is *VA<0> = false
25+
v is *VC = false
26+
v is *VD = false
27+
28+
set v to std::optional<int>(42)
29+
v is empty = false
30+
v is std::monostate = false
31+
v is int = true
32+
v is std::optional<int> = true
33+
v is std::unique_ptr<int> = false
34+
v is std::variant<int, double> = false
35+
v is VA<0> = false
36+
v is VC = false
37+
v is VD = false
38+
v is *VA<0> = false
39+
v is *VC = false
40+
v is *VD = false
41+
42+
set v to std::unique_ptr<int>()
43+
v is empty = true
44+
v is std::monostate = false
45+
v is int = false
46+
v is std::optional<int> = false
47+
v is std::unique_ptr<int> = true
48+
v is std::variant<int, double> = false
49+
v is VA<0> = false
50+
v is VC = false
51+
v is VD = false
52+
v is *VA<0> = false
53+
v is *VC = false
54+
v is *VD = false
55+
56+
set v to std::unique_ptr<int>(44)
57+
v is empty = false
58+
v is std::monostate = false
59+
v is int = true
60+
v is std::optional<int> = false
61+
v is std::unique_ptr<int> = true
62+
v is std::variant<int, double> = false
63+
v is VA<0> = false
64+
v is VC = false
65+
v is VD = false
66+
v is *VA<0> = false
67+
v is *VC = false
68+
v is *VD = false
69+
70+
set v to std::variant<int, double>(1)
71+
v is empty = false
72+
v is std::monostate = false
73+
v is int = true
74+
v is std::optional<int> = false
75+
v is std::unique_ptr<int> = false
76+
v is std::variant<int, double> = true
77+
v is VA<0> = false
78+
v is VC = false
79+
v is VD = false
80+
v is *VA<0> = false
81+
v is *VC = false
82+
v is *VD = false
83+
84+
set v to *VC
85+
v is empty = false
86+
v is std::monostate = false
87+
v is int = false
88+
v is std::optional<int> = false
89+
v is std::unique_ptr<int> = false
90+
v is std::variant<int, double> = false
91+
v is VA<0> = true
92+
v is VC = true
93+
v is VD = false
94+
v is *VA<0> = true
95+
v is *VC = true
96+
v is *VD = false
97+
98+
set v to *VD
99+
v is empty = false
100+
v is std::monostate = false
101+
v is int = false
102+
v is std::optional<int> = false
103+
v is std::unique_ptr<int> = false
104+
v is std::variant<int, double> = false
105+
v is VA<0> = true
106+
v is VC = false
107+
v is VD = true
108+
v is *VA<0> = true
109+
v is *VC = false
110+
v is *VD = true
111+

regression-tests/test-results/apple-clang-14-c++2b/mixed-recursive-is-as.cpp.output

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
2+
3+
//=== Cpp2 type declarations ====================================================
4+
5+
6+
#include "cpp2util.h"
7+
8+
#line 1 "mixed-recursive-is-as.cpp2"
9+
10+
#line 57 "mixed-recursive-is-as.cpp2"
11+
template<int I> class VA;
12+
13+
class VC;
14+
15+
16+
#line 64 "mixed-recursive-is-as.cpp2"
17+
class VD;
18+
19+
20+
//=== Cpp2 type definitions and function declarations ===========================
21+
22+
#line 1 "mixed-recursive-is-as.cpp2"
23+
auto test(auto&& v) -> void;
24+
25+
#line 18 "mixed-recursive-is-as.cpp2"
26+
auto set_and_test(auto& v, auto const& what, auto&& value) -> void;
27+
28+
#line 24 "mixed-recursive-is-as.cpp2"
29+
[[nodiscard]] auto main() -> int;
30+
#line 42 "mixed-recursive-is-as.cpp2"
31+
32+
template<int I>
33+
struct X { operator int() const { return I; } };
34+
35+
struct ThrowingConstruction {
36+
constexpr ThrowingConstruction() = default;
37+
ThrowingConstruction(int) { throw 1; }
38+
};
39+
40+
using PotentiallyThrowingVariant = std::variant<std::monostate,ThrowingConstruction,X<0>,X<1>,X<2>>;
41+
42+
void set_to_valueless_by_exception(auto& v) try {
43+
v.template emplace<1>(42);
44+
} catch (...) {}
45+
46+
template<int I> class VA {
47+
public: virtual ~VA() noexcept;
48+
49+
public: VA() = default;
50+
public: VA(VA const&) = delete; /* No 'that' constructor, suppress copy */
51+
public: auto operator=(VA const&) -> void = delete;
52+
};
53+
#line 58 "mixed-recursive-is-as.cpp2"
54+
55+
class VC: public VA<0>, public VA<1> {
56+
public: VC() = default;
57+
public: VC(VC const&) = delete; /* No 'that' constructor, suppress copy */
58+
public: auto operator=(VC const&) -> void = delete;
59+
60+
61+
#line 62 "mixed-recursive-is-as.cpp2"
62+
};
63+
64+
class VD: public VA<0> {
65+
public: VD() = default;
66+
public: VD(VD const&) = delete; /* No 'that' constructor, suppress copy */
67+
public: auto operator=(VD const&) -> void = delete;
68+
69+
70+
#line 66 "mixed-recursive-is-as.cpp2"
71+
};
72+
73+
74+
//=== Cpp2 function definitions =================================================
75+
76+
#line 1 "mixed-recursive-is-as.cpp2"
77+
auto test(auto&& v) -> void{
78+
#line 2 "mixed-recursive-is-as.cpp2"
79+
std::cout << "v is empty = " + cpp2::to_string(cpp2::impl::is<void>(v)) + "" << std::endl;
80+
std::cout << "v is std::monostate = " + cpp2::to_string(cpp2::impl::is<std::monostate>(v)) + "" << std::endl;
81+
std::cout << "v is int = " + cpp2::to_string(cpp2::impl::is<int>(v)) + "" << std::endl;
82+
std::cout << "v is std::optional<int> = " + cpp2::to_string(cpp2::impl::is<std::optional<int>>(v)) + "" << std::endl;
83+
std::cout << "v is std::unique_ptr<int> = " + cpp2::to_string(cpp2::impl::is<std::unique_ptr<int>>(v)) + "" << std::endl;
84+
std::cout << "v is std::variant<int, double> = " + cpp2::to_string(cpp2::impl::is<std::variant<int,double>>(v)) + "" << std::endl;
85+
std::cout << "v is VA<0>> = " + cpp2::to_string(cpp2::impl::is<VA<0>>(v)) + "" << std::endl;
86+
std::cout << "v is VC = " + cpp2::to_string(cpp2::impl::is<VC>(v)) + "" << std::endl;
87+
std::cout << "v is VD = " + cpp2::to_string(cpp2::impl::is<VD>(v)) + "" << std::endl;
88+
std::cout << "v is *VA<0> = " + cpp2::to_string(cpp2::impl::is<VA<0>*>(v)) + "" << std::endl;
89+
std::cout << "v is *VC> = " + cpp2::to_string(cpp2::impl::is<VC*>(v)) + "" << std::endl;
90+
std::cout << "v is *VD> = " + cpp2::to_string(cpp2::impl::is<VD*>(CPP2_FORWARD(v))) + "" << std::endl;
91+
92+
std::cout << std::endl;
93+
}
94+
95+
#line 18 "mixed-recursive-is-as.cpp2"
96+
auto set_and_test(auto& v, auto const& what, auto&& value) -> void{
97+
std::cout << "set v to " + cpp2::to_string(what) + "" << std::endl;
98+
v = CPP2_FORWARD(value);
99+
test(v);
100+
}
101+
102+
#line 24 "mixed-recursive-is-as.cpp2"
103+
[[nodiscard]] auto main() -> int{
104+
VC vc {};
105+
VD vd {};
106+
107+
std::variant<std::monostate,std::optional<int>,std::unique_ptr<int>,std::variant<int,double>,VA<0>*> v {};
108+
109+
test(v);
110+
111+
set_and_test(v, "std::optional<int>()", std::optional<int>());
112+
set_and_test(v, "std::optional<int>(42)", std::optional<int>(42));
113+
set_and_test(v, "std::unique_ptr<int>()", std::unique_ptr<int>());
114+
// set_and_test(v, "std::unique_ptr<int>(44)", new int(44));
115+
set_and_test(v, "std::variant<int, double>(1)", std::variant<int,double>(1));
116+
set_and_test(v, "*VC", &vc);
117+
set_and_test(v, "*VD", &vc);
118+
119+
test(cpp2::move(v));
120+
}
121+
122+
template <int I> VA<I>::~VA() noexcept{}
123+

regression-tests/test-results/mixed-recursive-is-as.cpp2.output

Whitespace-only changes.

0 commit comments

Comments
 (0)