diff options
| author | Takashi Kokubun <takashikkbn@gmail.com> | 2025-02-13 17:52:28 -0800 |
|---|---|---|
| committer | Takashi Kokubun <takashikkbn@gmail.com> | 2025-02-13 17:52:28 -0800 |
| commit | 82f7cb794109794f6ffa95ffb3be8e5149dd74bd (patch) | |
| tree | dc95f6454c938fa5f8e41346a4db32aa6570d561 | |
| parent | 68013d43a35a8368caa7b30c501e270333d04b35 (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.c | 5 | ||||
| -rw-r--r-- | test/prism/errors/defs_endless_method.txt | 12 | ||||
| -rw-r--r-- | test/prism/errors/setter_method_cannot_be_defined_in_an_endless_method_definition.txt | 3 | ||||
| -rw-r--r-- | version.h | 2 |
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 + @@ -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" |
