Skip to content

Commit

Permalink
overloadable enums no longer experimental (nim-lang#20298)
Browse files Browse the repository at this point in the history
depends on nim-lang#20126
  • Loading branch information
metagn authored Sep 5, 2022
1 parent 8dcf367 commit 5ebd124
Show file tree
Hide file tree
Showing 12 changed files with 27 additions and 41 deletions.
3 changes: 3 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
- Removed two type pragma syntaxes deprecated since 0.20, namely
`type Foo = object {.final.}`, and `type Foo {.final.} [T] = object`.

- [Overloadable enums](https://nim-lang.github.io/Nim/manual_experimental.html#overloadable-enum-value-names)
are no longer experimental.

## Standard library additions and changes

[//]: # "Changes:"
Expand Down
2 changes: 0 additions & 2 deletions compiler/lookups.nim
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,6 @@ iterator allSyms*(c: PContext): (PSym, int, bool) =
proc someSymFromImportTable*(c: PContext; name: PIdent; ambiguous: var bool): PSym =
var marked = initIntSet()
var symSet = OverloadableSyms
if overloadableEnums notin c.features:
symSet.excl skEnumField
result = nil
block outer:
for im in c.imports.mitems:
Expand Down
2 changes: 1 addition & 1 deletion compiler/options.nim
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ type
strictFuncs,
views,
strictNotNil,
overloadableEnums,
overloadableEnums, # not experimental anymore
strictEffects,
unicodeOperators,
flexibleOptionalParams
Expand Down
5 changes: 1 addition & 4 deletions compiler/semexprs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2882,10 +2882,7 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}, expectedType: PType
if optOwnedRefs in c.config.globalOptions:
result.typ = makeVarType(c, result.typ, tyOwned)
of skEnumField:
if overloadableEnums in c.features:
result = enumFieldSymChoice(c, n, s)
else:
result = semSym(c, n, s, flags)
result = enumFieldSymChoice(c, n, s)
else:
result = semSym(c, n, s, flags)
if expectedType != nil and isSymChoice(result):
Expand Down
6 changes: 1 addition & 5 deletions compiler/semgnrc.nim
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,7 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym,
result = n
onUse(n.info, s)
of skEnumField:
if overloadableEnums in c.features:
result = symChoice(c, n, s, scOpen)
else:
result = newSymNode(s, n.info)
onUse(n.info, s)
result = symChoice(c, n, s, scOpen)
else:
result = newSymNode(s, n.info)
onUse(n.info, s)
Expand Down
10 changes: 3 additions & 7 deletions compiler/semtempl.nim
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ proc semTemplSymbol(c: PContext, n: PNode, s: PSym; isField: bool): PNode =
of skUnknown:
# Introduced in this pass! Leave it as an identifier.
result = n
of OverloadableSyms-{skEnumField}:
of OverloadableSyms:
result = symChoice(c, n, s, scOpen, isField)
of skGenericParam:
if isField and sfGenSym in s.flags: result = n
Expand All @@ -261,12 +261,8 @@ proc semTemplSymbol(c: PContext, n: PNode, s: PSym; isField: bool): PNode =
if isField and sfGenSym in s.flags: result = n
else: result = newSymNodeTypeDesc(s, c.idgen, n.info)
else:
if s.kind == skEnumField and overloadableEnums in c.features:
result = symChoice(c, n, s, scOpen, isField)
elif isField and sfGenSym in s.flags:
result = n
else:
result = newSymNode(s, n.info)
if isField and sfGenSym in s.flags: result = n
else: result = newSymNode(s, n.info)
# Issue #12832
when defined(nimsuggest):
suggestSym(c.graph, n.info, s, c.graph.usageSym, false)
Expand Down
5 changes: 1 addition & 4 deletions compiler/semtypes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,7 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType =
onDef(e.info, e)
if sfGenSym notin e.flags:
if not isPure:
if overloadableEnums in c.features:
addInterfaceOverloadableSymAt(c, c.currentScope, e)
else:
addInterfaceDecl(c, e)
addInterfaceOverloadableSymAt(c, c.currentScope, e)
else:
declarePureEnumField(c, e)
if isPure and (let conflict = strTableInclReportConflict(symbols, e); conflict != nil):
Expand Down
6 changes: 3 additions & 3 deletions doc/manual_experimental.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,13 @@ No Unicode normalization step is performed.
Overloadable enum value names
=============================

Enabled via `{.experimental: "overloadableEnums".}`.

Enum value names are overloadable, much like routines. If both of the enums
`T` and `U` have a member named `foo`, then the identifier `foo` corresponds
to a choice between `T.foo` and `U.foo`. During overload resolution,
the correct type of `foo` is decided from the context. If the type of `foo` is
ambiguous, a static error will be produced.

```nim test = "nim c $1"
{.experimental: "overloadableEnums".}
type
E1 = enum
Expand All @@ -124,6 +121,9 @@ ambiguous, a static error will be produced.
p value2
```

Previously required `{.experimental: "overloadableEnums".}` to enable,
now always enabled.

Top-down type inference
=======================

Expand Down
2 changes: 2 additions & 0 deletions tests/enum/mregression.nim → tests/enum/mcrossmodule.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
type
OtherEnum* = enum
Success, Failed, More

proc some*(x: OtherEnum): bool = x == Success
10 changes: 10 additions & 0 deletions tests/enum/tcrossmodule.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import mcrossmodule

type
MyEnum = enum
Success

template t =
doAssert some(Success)

t()
13 changes: 0 additions & 13 deletions tests/enum/tregression.nim

This file was deleted.

4 changes: 2 additions & 2 deletions tests/sets/tsets.nim
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@ block:
k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k50, k51, k52, k53, k54, k55, k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k100

type
FakeMsgKind2 = range[k50..high(FakeMsgKind)]
FakeMsgKind2 = range[FakeMsgKind.k50..high(FakeMsgKind)]
FakeMsgKind2s = set[FakeMsgKind2]

const
a1: array[0..0, FakeMsgKind2s] = [{low(FakeMsgKind2)..high(FakeMsgKind2)} - {k99}]
a1: array[0..0, FakeMsgKind2s] = [{low(FakeMsgKind2)..high(FakeMsgKind2)} - {FakeMsgKind.k99}]
a2 = a1[0]

var
Expand Down

0 comments on commit 5ebd124

Please sign in to comment.