-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed #3706: rescue in initialize can lead to uninitialized instance …
…variables
- v0.24.1
- 1.15.1
- 1.15.0
- 1.14.1
- 1.14.0
- 1.13.3
- 1.13.2
- 1.13.1
- 1.13.0
- 1.12.2
- 1.12.1
- 1.12.0
- 1.11.2
- 1.11.1
- 1.11.0
- 1.10.1
- 1.10.0
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.2
- 1.8.1
- 1.8.0
- 1.7.3
- 1.7.2
- 1.7.1
- 1.7.0
- 1.6.2
- 1.6.1
- 1.6.0
- 1.5.1
- 1.5.0
- 1.4.1
- 1.4.0
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.1
- 1.1.0
- 1.0.0
- 0.36.1
- 0.36.0
- 0.35.1
- 0.35.0
- 0.34.0
- 0.33.0
- 0.32.1
- 0.32.0
- 0.31.1
- 0.31.0
- 0.30.1
- 0.30.0
- 0.29.0
- 0.28.0
- 0.27.2
- 0.27.1
- 0.27.0
- 0.26.1
- 0.26.0
- 0.25.1
- 0.25.0
- 0.24.2
- 0.24.1
- 0.24.0
- 0.23.1
- 0.23.0
- 0.22.0
- 0.21.1
- 0.21.0
- 0.20.5
- 0.20.4
- 0.20.3
- 0.20.2
Ary Borenszweig
committed
Dec 15, 2016
1 parent
366aec3
commit 02d4db3
Showing
3 changed files
with
42 additions
and
47 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -355,52 +355,6 @@ describe "Semantic: exception" do | |
)) { int32 } | ||
end | ||
|
||
it "doesn't type instance variable if initialized inside begin and rescue raises" do | ||
assert_type(%( | ||
require "prelude" | ||
class Foo | ||
def initialize | ||
begin | ||
@bar = 1 | ||
rescue | ||
raise "OH NO" | ||
end | ||
end | ||
def bar | ||
@bar | ||
end | ||
end | ||
foo = Foo.new | ||
foo.bar | ||
)) { int32 } | ||
end | ||
|
||
it "doesn't type instance variable if initialized inside begin and in rescue" do | ||
assert_type(%( | ||
require "prelude" | ||
class Foo | ||
def initialize | ||
begin | ||
@bar = 1 | ||
rescue | ||
@bar = 2 | ||
end | ||
end | ||
def bar | ||
@bar | ||
end | ||
end | ||
foo = Foo.new | ||
foo.bar | ||
)) { int32 } | ||
end | ||
|
||
it "correctly types #1988" do | ||
assert_type(%( | ||
begin | ||
|
@@ -445,4 +399,34 @@ describe "Semantic: exception" do | |
var | ||
)) { union_of(int32, string) } | ||
end | ||
|
||
it "marks instance variable as nilable if assigned inside rescue inside initialize" do | ||
assert_error %( | ||
require "prelude" | ||
def some_method | ||
if rand < 0.999999999 | ||
raise "OH NO" | ||
else | ||
2 | ||
end | ||
end | ||
class Coco < Exception | ||
def initialize(@x : Foo) | ||
end | ||
end | ||
class Foo | ||
def initialize | ||
@x = 1 | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
asterite
Member
|
||
rescue | ||
raise Coco.new(self) | ||
end | ||
end | ||
Foo.new | ||
), | ||
"instance variable '@x' of Foo must be Int32, not Nil" | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Question, in the issue #3706
@x
is being assigned tosome_method
but in this case that method is ignored.Perhaps
some_method
can be removed as it doesn't affectinitialize
?