aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--prism/prism.c2
-rw-r--r--test/prism/errors_test.rb14
2 files changed, 16 insertions, 0 deletions
diff --git a/prism/prism.c b/prism/prism.c
index 27617f8f70..96ed3989e2 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -2457,6 +2457,8 @@ pm_constant_path_or_write_node_create(pm_parser_t *parser, pm_constant_path_node
*/
static pm_constant_path_node_t *
pm_constant_path_node_create(pm_parser_t *parser, pm_node_t *parent, const pm_token_t *delimiter, pm_node_t *child) {
+ pm_assert_value_expression(parser, parent);
+
pm_constant_path_node_t *node = PM_ALLOC_NODE(parser, pm_constant_path_node_t);
*node = (pm_constant_path_node_t) {
diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb
index 82f50edd6e..3289f67a71 100644
--- a/test/prism/errors_test.rb
+++ b/test/prism/errors_test.rb
@@ -1654,6 +1654,7 @@ module Prism
(return).(1)
(return)[1]
(return)[1] = 2
+ (return)::foo
RUBY
message = 'Unexpected void value expression'
assert_errors expression(source), source, [
@@ -1661,6 +1662,19 @@ module Prism
[message, 14..20],
[message, 27..33],
[message, 39..45],
+ [message, 55..61],
+ ], compare_ripper: false # Ripper does not check 'void value expression'.
+ end
+
+ def test_void_value_expression_in_constant_path
+ source = <<~RUBY
+ (return)::A
+ class (return)::A; end
+ RUBY
+ message = 'Unexpected void value expression'
+ assert_errors expression(source), source, [
+ [message, 1..7],
+ [message, 19..25],
], compare_ripper: false # Ripper does not check 'void value expression'.
end