Skip to content

Commit 0e78159

Browse files
RX14Martin Verzilli
authored and
Martin Verzilli
committedMay 14, 2017
Prevent None and All members in flags enums (#4395)
* Prevent None and All members in flags enums Fixes #1251
1 parent 5455664 commit 0e78159

File tree

4 files changed

+63
-11
lines changed

4 files changed

+63
-11
lines changed
 

Diff for: ‎spec/compiler/codegen/enum_spec.cr

+14-10
Original file line numberDiff line numberDiff line change
@@ -106,25 +106,29 @@ describe "Code gen: enum" do
106106

107107
it "codegens enum None redefined" do
108108
run(%(
109-
@[Flags]
110-
enum Foo
111-
A
112-
None = 10
109+
lib Lib
110+
@[Flags]
111+
enum Foo
112+
A
113+
None = 10
114+
end
113115
end
114116
115-
Foo::None
117+
Lib::Foo::None
116118
)).to_i.should eq(10)
117119
end
118120

119121
it "codegens enum All redefined" do
120122
run(%(
121-
@[Flags]
122-
enum Foo
123-
A
124-
All = 10
123+
lib Lib
124+
@[Flags]
125+
enum Foo
126+
A
127+
All = 10
128+
end
125129
end
126130
127-
Foo::All
131+
Lib::Foo::All
128132
)).to_i.should eq(10)
129133
end
130134

Diff for: ‎spec/compiler/semantic/enum_spec.cr

+45
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,51 @@ describe "Semantic: enum" do
183183
)) { int32 }
184184
end
185185

186+
it "disallows None value when defined with @[Flags]" do
187+
assert_error %(
188+
@[Flags]
189+
enum Foo
190+
None
191+
end
192+
),
193+
"flags enum can't contain None or All members"
194+
end
195+
196+
it "disallows All value when defined with @[Flags]" do
197+
assert_error %(
198+
@[Flags]
199+
enum Foo
200+
All = 50
201+
end
202+
),
203+
"flags enum can't contain None or All members"
204+
end
205+
206+
it "doesn't error when defining a non-flags enum with None or All" do
207+
assert_type(%(
208+
enum Foo
209+
None
210+
All = 50
211+
end
212+
213+
Foo::None.value
214+
)) { int32 }
215+
end
216+
217+
it "doesn't error when defining a flags enum in a lib with None or All" do
218+
assert_type(%(
219+
lib Lib
220+
@[Flags]
221+
enum Foo
222+
None
223+
All = 50
224+
end
225+
end
226+
227+
Lib::Foo::None.value
228+
)) { int32 }
229+
end
230+
186231
it "doesn't error when defining a method for an enum with flags" do
187232
assert_type(%(
188233
@[Flags]

Diff for: ‎src/compiler/crystal/semantic/top_level_visitor.cr

+4
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,10 @@ class Crystal::TopLevelVisitor < Crystal::SemanticVisitor
550550
node.raise "can't reopen enum and add more constants to it"
551551
end
552552

553+
if is_flags && !@in_lib && {"None", "All"}.includes?(member.name)
554+
member.raise "flags enum can't contain None or All members, they are autogenerated"
555+
end
556+
553557
if default_value = member.default_value
554558
counter = interpret_enum_value(default_value, base_type)
555559
end

Diff for: ‎src/llvm/enums.cr

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ module LLVM
22
{% if LibLLVM.has_constant?(:AttributeRef) %}
33
@[Flags]
44
enum Attribute : UInt64
5-
None = 0
65
Alignment = 1 << 0
76
AllocSize = 1 << 1
87
AlwaysInline = 1 << 2

0 commit comments

Comments
 (0)
Please sign in to comment.