Skip to content

Commit da32b4f

Browse files
committed
Improve diagnostics for forward return, closes #1072
1 parent c724816 commit da32b4f

File tree

5 files changed

+224
-166
lines changed

5 files changed

+224
-166
lines changed
Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
pure2-forward-return-diagnostics-error.cpp2...
2-
pure2-forward-return-diagnostics-error.cpp2(1,28): error: a 'forward' return type cannot return a temporary variable
3-
pure2-forward-return-diagnostics-error.cpp2(2,28): error: a 'forward' return type cannot return a temporary variable
4-
pure2-forward-return-diagnostics-error.cpp2(3,28): error: a 'forward' return type cannot return a temporary variable
5-
pure2-forward-return-diagnostics-error.cpp2(4,28): error: a 'forward' return type cannot return a temporary variable
6-
pure2-forward-return-diagnostics-error.cpp2(5,28): error: a 'forward' return type cannot return a temporary variable
7-
pure2-forward-return-diagnostics-error.cpp2(6,28): error: a 'forward' return type cannot return a temporary variable
8-
pure2-forward-return-diagnostics-error.cpp2(7,28): error: a 'forward' return type cannot return a temporary variable
9-
pure2-forward-return-diagnostics-error.cpp2(8,28): error: a 'forward' return type cannot return a temporary variable
10-
pure2-forward-return-diagnostics-error.cpp2(9,28): error: a 'forward' return type cannot return a temporary variable
11-
pure2-forward-return-diagnostics-error.cpp2(10,28): error: a 'forward' return type cannot return a temporary variable
12-
pure2-forward-return-diagnostics-error.cpp2(11,28): error: a 'forward' return type cannot return a temporary variable
13-
pure2-forward-return-diagnostics-error.cpp2(12,28): error: a 'forward' return type cannot return a temporary variable
14-
pure2-forward-return-diagnostics-error.cpp2(13,28): error: a 'forward' return type cannot return a temporary variable
15-
pure2-forward-return-diagnostics-error.cpp2(14,28): error: a 'forward' return type cannot return a temporary variable
16-
pure2-forward-return-diagnostics-error.cpp2(15,28): error: a 'forward' return type cannot return a temporary variable
17-
pure2-forward-return-diagnostics-error.cpp2(16,28): error: a 'forward' return type cannot return a temporary variable
18-
pure2-forward-return-diagnostics-error.cpp2(17,28): error: a 'forward' return type cannot return a temporary variable
19-
pure2-forward-return-diagnostics-error.cpp2(18,28): error: a 'forward' return type cannot return a temporary variable
20-
pure2-forward-return-diagnostics-error.cpp2(19,28): error: a 'forward' return type cannot return a temporary variable
21-
pure2-forward-return-diagnostics-error.cpp2(20,28): error: a 'forward' return type cannot return a temporary variable
22-
pure2-forward-return-diagnostics-error.cpp2(21,28): error: a 'forward' return type cannot return a temporary variable
23-
pure2-forward-return-diagnostics-error.cpp2(22,28): error: a 'forward' return type cannot return a temporary variable
2+
pure2-forward-return-diagnostics-error.cpp2(1,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
3+
pure2-forward-return-diagnostics-error.cpp2(2,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
4+
pure2-forward-return-diagnostics-error.cpp2(3,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
5+
pure2-forward-return-diagnostics-error.cpp2(4,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
6+
pure2-forward-return-diagnostics-error.cpp2(5,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
7+
pure2-forward-return-diagnostics-error.cpp2(6,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
8+
pure2-forward-return-diagnostics-error.cpp2(7,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
9+
pure2-forward-return-diagnostics-error.cpp2(8,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
10+
pure2-forward-return-diagnostics-error.cpp2(9,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
11+
pure2-forward-return-diagnostics-error.cpp2(10,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
12+
pure2-forward-return-diagnostics-error.cpp2(11,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
13+
pure2-forward-return-diagnostics-error.cpp2(12,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
14+
pure2-forward-return-diagnostics-error.cpp2(13,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
15+
pure2-forward-return-diagnostics-error.cpp2(14,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
16+
pure2-forward-return-diagnostics-error.cpp2(15,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
17+
pure2-forward-return-diagnostics-error.cpp2(16,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
18+
pure2-forward-return-diagnostics-error.cpp2(17,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
19+
pure2-forward-return-diagnostics-error.cpp2(18,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
20+
pure2-forward-return-diagnostics-error.cpp2(19,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
21+
pure2-forward-return-diagnostics-error.cpp2(20,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
22+
pure2-forward-return-diagnostics-error.cpp2(21,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
23+
pure2-forward-return-diagnostics-error.cpp2(22,28): error: a 'forward' return type must return an 'inout', 'out', or 'forward' parameter; it cannot return a complex expression -- for example: for a function that takes a stream object 'output`, instead of 'return output << data;' write 'output << data; return output;'
2424

source/parse.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2479,6 +2479,18 @@ struct function_type_node
24792479
return has_parameter_with_name_and_pass(s, passing_style::in);
24802480
}
24812481

2482+
auto has_copy_parameter_named(std::string_view s) const
2483+
-> bool
2484+
{
2485+
return has_parameter_with_name_and_pass(s, passing_style::copy);
2486+
}
2487+
2488+
auto has_inout_parameter_named(std::string_view s) const
2489+
-> bool
2490+
{
2491+
return has_parameter_with_name_and_pass(s, passing_style::inout);
2492+
}
2493+
24822494
auto has_out_parameter_named(std::string_view s) const
24832495
-> bool
24842496
{
@@ -2491,6 +2503,12 @@ struct function_type_node
24912503
return has_parameter_with_name_and_pass(s, passing_style::move);
24922504
}
24932505

2506+
auto has_forward_parameter_named(std::string_view s) const
2507+
-> bool
2508+
{
2509+
return has_parameter_with_name_and_pass(s, passing_style::forward);
2510+
}
2511+
24942512
// Internals
24952513
//
24962514
auto position() const
@@ -2923,6 +2941,24 @@ struct declaration_node
29232941
return std::get<a_function>(type)->has_in_parameter_named(s);
29242942
}
29252943

2944+
auto has_copy_parameter_named(std::string_view s) const
2945+
-> bool
2946+
{
2947+
if (!is_function()) {
2948+
return false;
2949+
}
2950+
return std::get<a_function>(type)->has_copy_parameter_named(s);
2951+
}
2952+
2953+
auto has_inout_parameter_named(std::string_view s) const
2954+
-> bool
2955+
{
2956+
if (!is_function()) {
2957+
return false;
2958+
}
2959+
return std::get<a_function>(type)->has_inout_parameter_named(s);
2960+
}
2961+
29262962
auto has_out_parameter_named(std::string_view s) const
29272963
-> bool
29282964
{
@@ -2941,6 +2977,15 @@ struct declaration_node
29412977
return std::get<a_function>(type)->has_move_parameter_named(s);
29422978
}
29432979

2980+
auto has_forward_parameter_named(std::string_view s) const
2981+
-> bool
2982+
{
2983+
if (!is_function()) {
2984+
return false;
2985+
}
2986+
return std::get<a_function>(type)->has_forward_parameter_named(s);
2987+
}
2988+
29442989
auto nth_parameter_type_name(int n) const
29452990
-> std::string
29462991
{

0 commit comments

Comments
 (0)