summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2025-02-13 17:52:28 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2025-02-13 17:52:28 -0800
commit82f7cb794109794f6ffa95ffb3be8e5149dd74bd (patch)
treedc95f6454c938fa5f8e41346a4db32aa6570d561
parent68013d43a35a8368caa7b30c501e270333d04b35 (diff)
merge revision(s) ad96c5a72908042489357b73dc936c4bc38d919b, ca81142eff98cccb03ff523322aefe4e7346fd0e: [Backport #21010]
[ruby/prism] Throw syntax error for endless method with `[]=` Prism shoudld throw a syntax error for endless methods when the method name uses brackets. Previously it would not. This matches the behavior of parse.y. Fixes https://bugs.ruby-lang.org/issues/21010 https://github.com/ruby/prism/commit/43c16a89ef [ruby/prism] [Bug #21010] Reject endless method definition of `[]=` Fixes: https://bugs.ruby-lang.org/issues/20785 https://github.com/ruby/prism/commit/192960ce5d
-rw-r--r--prism/prism.c5
-rw-r--r--test/prism/errors/defs_endless_method.txt12
-rw-r--r--test/prism/errors/setter_method_cannot_be_defined_in_an_endless_method_definition.txt3
-rw-r--r--version.h2
4 files changed, 19 insertions, 3 deletions
diff --git a/prism/prism.c b/prism/prism.c
index 47106147d0..9d21b25b7c 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -1731,9 +1731,10 @@ char_is_global_name_punctuation(const uint8_t b) {
static inline bool
token_is_setter_name(pm_token_t *token) {
return (
- (token->type == PM_TOKEN_IDENTIFIER) &&
+ (token->type == PM_TOKEN_BRACKET_LEFT_RIGHT_EQUAL) ||
+ ((token->type == PM_TOKEN_IDENTIFIER) &&
(token->end - token->start >= 2) &&
- (token->end[-1] == '=')
+ (token->end[-1] == '='))
);
}
diff --git a/test/prism/errors/defs_endless_method.txt b/test/prism/errors/defs_endless_method.txt
new file mode 100644
index 0000000000..80db648e62
--- /dev/null
+++ b/test/prism/errors/defs_endless_method.txt
@@ -0,0 +1,12 @@
+def f=(k,v)=1
+ ^~ invalid method name; a setter method cannot be defined in an endless method definition
+
+def obj.f=(k,v)=1
+ ^~ invalid method name; a setter method cannot be defined in an endless method definition
+
+def []=(k,v)=1
+ ^~~ invalid method name; a setter method cannot be defined in an endless method definition
+
+def obj.[]=(k,v)=1
+ ^~~ invalid method name; a setter method cannot be defined in an endless method definition
+
diff --git a/test/prism/errors/setter_method_cannot_be_defined_in_an_endless_method_definition.txt b/test/prism/errors/setter_method_cannot_be_defined_in_an_endless_method_definition.txt
index c4440ccc7e..7927664f3c 100644
--- a/test/prism/errors/setter_method_cannot_be_defined_in_an_endless_method_definition.txt
+++ b/test/prism/errors/setter_method_cannot_be_defined_in_an_endless_method_definition.txt
@@ -1,3 +1,6 @@
def a=() = 42
^~ invalid method name; a setter method cannot be defined in an endless method definition
+def []=() = 42
+ ^~~ invalid method name; a setter method cannot be defined in an endless method definition
+
diff --git a/version.h b/version.h
index 63a909dec2..c7e4308eb8 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 1
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 5
+#define RUBY_PATCHLEVEL 6
#include "ruby/version.h"
#include "ruby/internal/abi.h"