Skip to content

Commit 930e70a

Browse files
committed
Output of unnamed type param name for typed template arguments.
1 parent 0d79a3b commit 930e70a

File tree

4 files changed

+80
-5
lines changed

4 files changed

+80
-5
lines changed

regression-tests/pure2-variadics.cpp2

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@ y: <Ts...: int> type = {
1212
func: () ( 0 + ... + Ts);
1313
}
1414

15+
// Discard type name pack expansion
16+
t0: @struct <_...> type = {
17+
f: <_: int> () -> i32 = 0;
18+
}
19+
20+
// Discard template type pack expansion
21+
t1: @struct <T...: _> type = {
22+
f: <_: int> () -> i32 = 0;
23+
}
24+
25+
// Discard typename and template type pack expansion
26+
t2: @struct <_...: _> type = {
27+
f: <_: int> () -> i32 = 0;
28+
}
29+
1530
left_fold_print: <Args...: type> (inout out: std::ostream, args...: Args) = {
1631
// Binary left fold expression
1732
(out << ... << args);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
pure2-variadics.cpp2:21:10: error: ‘R’ has not been declared
2+
pure2-variadics.cpp2:17:20: error: declaration of template parameter ‘T’ shadows template parameter
3+
pure2-variadics.cpp2:16:10: note: template parameter ‘T’ declared here
4+
pure2-variadics.cpp2:21:10: error: ‘R’ has not been declared
5+
pure2-variadics.cpp2:27:20: error: declaration of template parameter ‘_’ shadows template parameter
6+
pure2-variadics.cpp2:26:10: note: template parameter ‘_’ declared here
7+
pure2-variadics.cpp2:17:33: error: declaration of template parameter ‘T’ shadows template parameter
8+
pure2-variadics.cpp2:17:13: note: template parameter ‘T’ declared here
9+
pure2-variadics.cpp2:17:63: error: expansion pattern ‘T’ contains no parameter packs
10+
pure2-variadics.cpp2:17:66: error: template argument 1 is invalid
11+
pure2-variadics.cpp2:17:59: error: too many template-parameter-lists
12+
pure2-variadics.cpp2:22:13: error: ‘R’ has not been declared
13+
pure2-variadics.cpp2:22:60: error: expansion pattern ‘_’ contains no parameter packs
14+
pure2-variadics.cpp2:22:63: error: template argument 1 is invalid
15+
pure2-variadics.cpp2:22:56: error: too many template-parameter-lists
16+
pure2-variadics.cpp2:27:33: error: declaration of template parameter ‘_’ shadows template parameter
17+
pure2-variadics.cpp2:27:13: note: template parameter ‘_’ declared here
18+
pure2-variadics.cpp2:27:63: error: expansion pattern ‘_’ contains no parameter packs
19+
pure2-variadics.cpp2:27:66: error: template argument 1 is invalid
20+
pure2-variadics.cpp2:27:59: error: too many template-parameter-lists

regression-tests/test-results/pure2-variadics.cpp

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ template<typename ...Ts> class x;
1515
#line 10 "pure2-variadics.cpp2"
1616
template<int ...Ts> class y;
1717

18+
#line 16 "pure2-variadics.cpp2"
19+
template<typename ...UnnamedTypeParam1> class t0;
20+
21+
22+
#line 21 "pure2-variadics.cpp2"
23+
template<auto ...T> class t1;
24+
25+
26+
#line 26 "pure2-variadics.cpp2"
27+
template<auto ...UnnamedTypeParam1> class t2;
28+
1829

1930
//=== Cpp2 type definitions and function declarations ===========================
2031

@@ -44,12 +55,27 @@ template<int ...Ts> class y {
4455
#line 13 "pure2-variadics.cpp2"
4556
};
4657

58+
// Discard type name pack expansion
59+
template<typename ...UnnamedTypeParam1> class t0 {
60+
public: template<int UnnamedTypeParam1> [[nodiscard]] static auto f() -> cpp2::i32;
61+
};
62+
63+
// Discard template type pack expansion
64+
template<auto ...T> class t1 {
65+
public: template<int UnnamedTypeParam1> [[nodiscard]] static auto f() -> cpp2::i32;
66+
};
67+
68+
// Discard typename and template type pack expansion
69+
template<auto ...UnnamedTypeParam1> class t2 {
70+
public: template<int UnnamedTypeParam1> [[nodiscard]] static auto f() -> cpp2::i32;
71+
};
72+
4773
template<typename ...Args> auto left_fold_print(std::ostream& out, Args const& ...args) -> void;
4874

49-
#line 20 "pure2-variadics.cpp2"
75+
#line 35 "pure2-variadics.cpp2"
5076
template<typename ...Args> [[nodiscard]] auto all(Args const& ...args) -> bool;
5177

52-
#line 24 "pure2-variadics.cpp2"
78+
#line 39 "pure2-variadics.cpp2"
5379
template <typename ...Args> [[nodiscard]] auto make_string(Args&& ...args) -> auto;
5480

5581
template <typename T, typename ...Args> [[nodiscard]] auto make(Args&& ...args) -> auto;
@@ -66,7 +92,16 @@ auto main() -> int;
6692
#line 12 "pure2-variadics.cpp2"
6793
template <int ...Ts> [[nodiscard]] auto y<Ts...>::func() -> auto { return (0 + ... + Ts); }
6894

69-
#line 15 "pure2-variadics.cpp2"
95+
#line 17 "pure2-variadics.cpp2"
96+
template <typename ...UnnamedTypeParam1> template<int UnnamedTypeParam1> [[nodiscard]] auto t0<_...>::f() -> cpp2::i32 { return 0; }
97+
98+
#line 22 "pure2-variadics.cpp2"
99+
template <auto ...T> template<int UnnamedTypeParam1> [[nodiscard]] auto t1<T...>::f() -> cpp2::i32 { return 0; }
100+
101+
#line 27 "pure2-variadics.cpp2"
102+
template <auto ...UnnamedTypeParam1> template<int UnnamedTypeParam1> [[nodiscard]] auto t2<_...>::f() -> cpp2::i32 { return 0; }
103+
104+
#line 30 "pure2-variadics.cpp2"
70105
template<typename ...Args> auto left_fold_print(std::ostream& out, Args const& ...args) -> void{
71106
// Binary left fold expression
72107
(out << ... << args);
@@ -82,7 +117,7 @@ template <typename T, typename ...Args> [[nodiscard]] auto make(Args&& ...args)
82117

83118
auto main() -> int
84119
{
85-
x<int,long,std::string> auto_30_5 {};
120+
x<int,long,std::string> auto_45_5 {};
86121

87122
std::cout << std::string("xyzzy", 3) << "\n";
88123
std::cout << make_string("plugh", cpp2::u8{3}) << "\n";

source/to_cpp1.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4294,7 +4294,12 @@ class cppfront
42944294
if (n.declaration->is_variadic) {
42954295
printer.print_cpp2("...",identifier_pos);
42964296
}
4297-
printer.print_cpp2( identifier, identifier_pos );
4297+
if (identifier == "_") {
4298+
printer.print_cpp2( "UnnamedTypeParam" + std::to_string(n.ordinal), identifier_pos );
4299+
}
4300+
else {
4301+
printer.print_cpp2( identifier, identifier_pos );
4302+
}
42984303
return;
42994304
}
43004305

0 commit comments

Comments
 (0)