[ruby-core:93909] Re: [Ruby master Bug#16020] Forbid `if` `elsif` without a condition

From: Austin Ziegler <halostatue@...>
Date: 2019-07-25 13:46:44 UTC
List: ruby-core #93909
This is not a syntax error, but a logic error. Ruby is not line-oriented,
but expression oriented. The parser knows that `if` has to have a
condition, so if it does not find one in the next token, it looks for the
next expression.

This is what your code _actually_ got parsed as:

```ruby
if puts "!!!!1"
elsif puts "!!!!2"
elsif puts "!!!!3"
else
  puts "!!!!4"
end
```

`Kernel#puts` returns `nil`, which is falsy and imperative, so the `puts`
for 1, 2, and 3 must execute and because all of them are false, the puts
for 4 executes.

This is clearer if you add something else:

```ruby
if puts "!!!!1"
  puts 1
elsif puts "!!!!2"
  puts 2
elsif puts "!!!!3"
  puts 3
else
  puts "!!!!4"
end
```

-a

On Thu, Jul 25, 2019 at 8:17 AM <bogdanvlviv@gmail.com> wrote:

> Issue #16020 has been reported by bogdanvlviv (Bogdan Denkovych).
>
> ----------------------------------------
> Bug #16020: Forbid `if` `elsif` without a condition
> https://bugs.ruby-lang.org/issues/16020
>
> * Author: bogdanvlviv (Bogdan Denkovych)
> * Status: Open
> * Priority: Normal
> * Assignee:
> * Target version:
> * ruby -v: ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux
> * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
> ----------------------------------------
> Hello.
>
> I might have missed something, but examples like:
> ```ruby
> if
>   puts "!!!!1"
> elsif
>   puts "!!!!2"
> elsif
>   puts "!!!!3"
> else
>   puts "!!!!4"
> end
>
> # Output:
> # !!!!1
> # !!!!2
> # !!!!3
> # !!!!4
> ```
>
> ```ruby
> if false
>   puts "!!!!1"
> elsif 1==2
>   puts "!!!!2"
> elsif
>   puts "!!!!3"
> else
>   puts "!!!!4"
> end
>
> # Output:
> # !!!!3
> # !!!!4
> ```
>
> are confusing. We probably should raise `SyntaxError` in the case when
> `if`/`elsif` is being used without any condition. What do you think about
> it?
>
> Original source:
> https://twitter.com/bogdanvlviv/status/1154356514628493313
>
>
>
> --
> https://bugs.ruby-lang.org/
>
> Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
>


-- 
Austin Ziegler 窶「 halostatue@gmail.com 窶「 austin@halostatue.ca
http://www.halostatue.ca/ 窶「 http://twitter.com/halostatue

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next