From 7acedf8cedc18d5541f959c64da9b130dd5a4c9e Mon Sep 17 00:00:00 2001 From: TSUYUSATO Kitsune Date: Fri, 3 Nov 2017 08:54:47 +0900 Subject: [PATCH] Can't use `self` in toplevel method (#5227) Related issue #5225 --- spec/compiler/semantic/def_spec.cr | 10 ++++++++++ src/compiler/crystal/semantic/main_visitor.cr | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/spec/compiler/semantic/def_spec.cr b/spec/compiler/semantic/def_spec.cr index 4cf7fede5280..3c35970ecc34 100644 --- a/spec/compiler/semantic/def_spec.cr +++ b/spec/compiler/semantic/def_spec.cr @@ -476,4 +476,14 @@ describe "Semantic: def" do foo(1) )) { int32.metaclass } end + + it "can't use self in toplevel method" do + assert_error %( + def foo + self + end + + foo + ), "there's no self in this scope" + end end diff --git a/src/compiler/crystal/semantic/main_visitor.cr b/src/compiler/crystal/semantic/main_visitor.cr index 75e09d5ff6f9..228a1d21ef17 100644 --- a/src/compiler/crystal/semantic/main_visitor.cr +++ b/src/compiler/crystal/semantic/main_visitor.cr @@ -341,6 +341,10 @@ module Crystal def visit(node : Var) var = @vars[node.name]? if var + if var.type?.is_a?(Program) && node.name == "self" + node.raise "there's no self in this scope" + end + meta_var = @meta_vars[node.name] check_closured meta_var