Skip to content

Commit 62809a2

Browse files
committed
fix(to_cpp1): use specialization arguments in definition
1 parent 955a8ec commit 62809a2

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

regression-tests/pure2-template-specialization.cpp2

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ t: @struct <T> specialize<T> type requires std::is_void_v<T> = {
77
t: @struct specialize<i64> type = {
88
c: i32 = 3;
99
}
10+
t: @struct specialize<* i8> type = {
11+
f: () 17;
12+
v: int == 29;
13+
}
14+
t: @struct <T> specialize<* T> type = {
15+
v: int == 17;
16+
f: () 29;
17+
}
1018
v: <T> const i32 = 1;
1119
v: <> specialize<void> const i32 = 2;
1220
v: specialize<i64> const i32 = 3;
@@ -17,6 +25,10 @@ main: () = {
1725
assert(t<i32>().a == 1);
1826
assert(t<void>().b == 2);
1927
assert(t<i64>().c == 3);
28+
assert(t<* i8>::f() == 17);
29+
assert(t<* i8>::v == 29);
30+
assert(t<* i16>::v == 17);
31+
assert(t<* i16>::f() == 29);
2032
assert(v<i32> == 1);
2133
assert(v<void> == 2);
2234
assert(v<i64> == 3);

regression-tests/test-results/pure2-template-specialization.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,17 @@ template<typename T> requires( std::is_void_v<T> )
2020
template<> class t<cpp2::i64> {
2121
public: cpp2::i32 c {3};
2222
};
23+
template<> class t<cpp2::i8*> {
24+
public: [[nodiscard]] static auto f() -> auto;
25+
public: static const int v;
26+
};
27+
template<typename T> class t<T*> {
28+
public: static const int v;
29+
public: [[nodiscard]] static auto f() -> auto;
30+
};
2331
template<typename T> extern cpp2::i32 const v;
2432

25-
#line 13 "pure2-template-specialization.cpp2"
33+
#line 21 "pure2-template-specialization.cpp2"
2634
template<> std::optional<cpp2::i32> inline constexpr v<cpp2::i16> = 4;
2735
template<> std::optional<cpp2::i8> inline constexpr v<cpp2::i8> = 5;
2836
template<typename T> std::optional<int> inline constexpr v<T*> = 6;
@@ -32,16 +40,27 @@ auto main() -> int;
3240
//=== Cpp2 function definitions =================================================
3341

3442

35-
#line 10 "pure2-template-specialization.cpp2"
43+
#line 11 "pure2-template-specialization.cpp2"
44+
[[nodiscard]] auto t<cpp2::i8*>::f() -> auto { return 17; }
45+
inline CPP2_CONSTEXPR int t<cpp2::i8*>::v = 29;
46+
47+
#line 15 "pure2-template-specialization.cpp2"
48+
template <typename T> inline CPP2_CONSTEXPR int t<T*>::v = 17;
49+
template <typename T> [[nodiscard]] auto t<T*>::f() -> auto { return 29; }
50+
3651
template<typename T> cpp2::i32 const v {1};
3752
template<> cpp2::i32 const v<void> {2};
3853
template<> cpp2::i32 const v<cpp2::i64> {3};
3954

40-
#line 16 "pure2-template-specialization.cpp2"
55+
#line 24 "pure2-template-specialization.cpp2"
4156
auto main() -> int{
4257
cpp2::Default.expects(t<cpp2::i32>().a == 1, "");
4358
cpp2::Default.expects(t<void>().b == 2, "");
4459
cpp2::Default.expects(t<cpp2::i64>().c == 3, "");
60+
cpp2::Default.expects(t<cpp2::i8*>::f() == 17, "");
61+
cpp2::Default.expects(t<cpp2::i8*>::v == 29, "");
62+
cpp2::Default.expects(t<cpp2::i16*>::v == 17, "");
63+
cpp2::Default.expects(t<cpp2::i16*>::f() == 29, "");
4564
cpp2::Default.expects(v<cpp2::i32> == 1, "");
4665
cpp2::Default.expects(v<void> == 2, "");
4766
cpp2::Default.expects(v<cpp2::i64> == 3, "");

source/to_cpp1.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4593,7 +4593,10 @@ class cppfront
45934593
)
45944594
{
45954595
auto list = std::string{""};
4596-
if (parent->template_parameters) {
4596+
if (parent->specialization_template_arguments) {
4597+
list = print_to_string(*parent->specialization_template_arguments, false, true, false, false);
4598+
}
4599+
else if (parent->template_parameters) {
45974600
auto separator = std::string{"<"};
45984601
for (auto& tparam : parent->template_parameters->parameters) {
45994602
assert (tparam->has_name());
@@ -5242,7 +5245,7 @@ class cppfront
52425245

52435246
auto specialization_template_arguments = std::string{};
52445247
if (n.specialization_template_arguments) {
5245-
specialization_template_arguments = print_to_string(*n.specialization_template_arguments, false, true, false, false);
5248+
specialization_template_arguments = print_to_string(*n.specialization_template_arguments, false, false, false, false);
52465249
}
52475250

52485251
printer.print_cpp2(
@@ -5446,7 +5449,7 @@ class cppfront
54465449
printer.print_cpp2("class ", n.position());
54475450
emit(*n.identifier);
54485451
if (n.specialization_template_arguments) {
5449-
emit(*n.specialization_template_arguments, false, true, false, false);
5452+
emit(*n.specialization_template_arguments, false, false, false, false);
54505453
}
54515454

54525455
// Type declaration
@@ -6191,7 +6194,7 @@ class cppfront
61916194
else {
61926195
emit(*n.identifier);
61936196
if (n.specialization_template_arguments) {
6194-
emit(*n.specialization_template_arguments, false, true, false, false);
6197+
emit(*n.specialization_template_arguments, false, false, false, false);
61956198
}
61966199
}
61976200

0 commit comments

Comments
 (0)