diff options
author | metagn <metagngn@gmail.com> | 2024-09-18 20:27:09 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-18 19:27:09 +0200 |
commit | 0c3573e4a0628bbaa8b09dcd854bdc2702948bbc (patch) | |
tree | 0395872790437f6eebf2c52a8401fbbb22254d33 /compiler | |
parent | 79b17b7c05f66a032949135f4d5a4a62ab9c36a0 (diff) | |
download | Nim-0c3573e4a0628bbaa8b09dcd854bdc2702948bbc.tar.gz |
make `genericsOpenSym` work at instantiation time, new behavior in `openSym` (#24111)
alternative to #24101 #23892 changed the opensym experimental switch so that it has to be enabled in the context of the generic/template declarations capturing the symbols, not the context of the instantiation of the generics/templates. This was to be in line with where the compiler gives the warnings and changes behavior in a potentially breaking way. However `results` [depends on the old behavior](https://github.com/arnetheduck/nim-results/blob/71d404b314479a6205bfd050f4fe5fe49cdafc69/results.nim#L1428), so that the callers of the macros provided by results always take advantage of the opensym behavior. To accomodate this, we change the behavior of the old experimental option that `results` uses, `genericsOpenSym`, so that ignores the information of whether or not symbols are intentionally opened and always gives the opensym behavior as long as it's enabled at instantiation time. This should keep `results` working as is. However this differs from the normal opensym switch in that it doesn't generate `nnkOpenSym`. Before it was just a generics-only version of `openSym` along with `templateOpenSym` which was only for templates. So `templateOpenSym` is removed along with this change, but no one appears to have used it.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/condsyms.nim | 1 | ||||
-rw-r--r-- | compiler/options.nim | 4 | ||||
-rw-r--r-- | compiler/semexprs.nim | 13 | ||||
-rw-r--r-- | compiler/semgnrc.nim | 12 | ||||
-rw-r--r-- | compiler/semtempl.nim | 8 |
5 files changed, 23 insertions, 15 deletions
diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim index 3119e657e..5043fc5d4 100644 --- a/compiler/condsyms.nim +++ b/compiler/condsyms.nim @@ -167,4 +167,5 @@ proc initDefines*(symbols: StringTableRef) = defineSymbol("nimHasVtables") defineSymbol("nimHasGenericsOpenSym2") + defineSymbol("nimHasGenericsOpenSym3") defineSymbol("nimHasJsNoLambdaLifting") diff --git a/compiler/options.nim b/compiler/options.nim index 44196609a..b77bdd2a3 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -226,8 +226,8 @@ type strictCaseObjects, inferGenericTypes, openSym, # remove nfDisabledOpenSym when this is default - # separated alternatives to above: - genericsOpenSym, templateOpenSym, + # alternative to above: + genericsOpenSym vtables LegacyFeature* = enum diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index c90aa991b..41493b046 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -187,6 +187,7 @@ proc semOpenSym(c: PContext, n: PNode, flags: TExprFlags, expectedType: PType, break o = o.owner # nothing found + n.flags.excl nfDisabledOpenSym if not warnDisabled and isSym: result = semExpr(c, n, flags, expectedType) else: @@ -197,7 +198,9 @@ proc semOpenSym(c: PContext, n: PNode, flags: TExprFlags, expectedType: PType, proc semSymChoice(c: PContext, n: PNode, flags: TExprFlags = {}, expectedType: PType = nil): PNode = if n.kind == nkOpenSymChoice: - result = semOpenSym(c, n, flags, expectedType, warnDisabled = nfDisabledOpenSym in n.flags) + result = semOpenSym(c, n, flags, expectedType, + warnDisabled = nfDisabledOpenSym in n.flags and + genericsOpenSym notin c.features) if result != nil: return result = n @@ -3293,8 +3296,12 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}, expectedType: PType of nkSym: let s = n.sym if nfDisabledOpenSym in n.flags: - let res = semOpenSym(c, n, flags, expectedType, warnDisabled = true) - assert res == nil + let override = genericsOpenSym in c.features + let res = semOpenSym(c, n, flags, expectedType, + warnDisabled = not override) + if res != nil: + assert override + return res # because of the changed symbol binding, this does not mean that we # don't have to check the symbol for semantics here again! result = semSym(c, n, s, flags) diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index 16bb7f094..2639aba6c 100644 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -74,7 +74,7 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym, else: result = symChoice(c, n, s, scOpen) if canOpenSym(s): - if {openSym, genericsOpenSym} * c.features != {}: + if openSym in c.features: if result.kind == nkSym: result = newOpenSym(result) else: @@ -112,7 +112,7 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym, # we are in a generic context and `prepareNode` will be called result = newSymNodeTypeDesc(s, c.idgen, n.info) if canOpenSym(result.sym): - if {openSym, genericsOpenSym} * c.features != {}: + if openSym in c.features: result = newOpenSym(result) else: result.flags.incl nfDisabledOpenSym @@ -122,7 +122,7 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym, else: result = newSymNodeTypeDesc(s, c.idgen, n.info) if canOpenSym(result.sym): - if {openSym, genericsOpenSym} * c.features != {}: + if openSym in c.features: result = newOpenSym(result) else: result.flags.incl nfDisabledOpenSym @@ -141,7 +141,7 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym, return result = newSymNodeTypeDesc(s, c.idgen, n.info) if canOpenSym(result.sym): - if {openSym, genericsOpenSym} * c.features != {}: + if openSym in c.features: result = newOpenSym(result) else: result.flags.incl nfDisabledOpenSym @@ -153,7 +153,7 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym, # we are in a generic context and `prepareNode` will be called result = newSymNodeTypeDesc(s, c.idgen, n.info) if canOpenSym(result.sym): - if {openSym, genericsOpenSym} * c.features != {}: + if openSym in c.features: result = newOpenSym(result) else: result.flags.incl nfDisabledOpenSym @@ -164,7 +164,7 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym, else: result = newSymNode(s, n.info) if canOpenSym(result.sym): - if {openSym, genericsOpenSym} * c.features != {}: + if openSym in c.features: result = newOpenSym(result) else: result.flags.incl nfDisabledOpenSym diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index 7546d095d..8bc68728c 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -233,7 +233,7 @@ proc semTemplSymbol(c: var TemplCtx, n: PNode, s: PSym; isField, isAmbiguous: bo of OverloadableSyms: result = symChoice(c.c, n, s, scOpen, isField) if not isField and result.kind in {nkSym, nkOpenSymChoice}: - if {openSym, templateOpenSym} * c.c.features != {}: + if openSym in c.c.features: if result.kind == nkSym: result = newOpenSym(result) else: @@ -246,7 +246,7 @@ proc semTemplSymbol(c: var TemplCtx, n: PNode, s: PSym; isField, isAmbiguous: bo else: result = newSymNodeTypeDesc(s, c.c.idgen, n.info) if not isField and s.owner != c.owner: - if {openSym, templateOpenSym} * c.c.features != {}: + if openSym in c.c.features: result = newOpenSym(result) else: result.flags.incl nfDisabledOpenSym @@ -264,7 +264,7 @@ proc semTemplSymbol(c: var TemplCtx, n: PNode, s: PSym; isField, isAmbiguous: bo if not isField and not (s.owner == c.owner and s.typ != nil and s.typ.kind == tyGenericParam) and result.kind in {nkSym, nkOpenSymChoice}: - if {openSym, templateOpenSym} * c.c.features != {}: + if openSym in c.c.features: if result.kind == nkSym: result = newOpenSym(result) else: @@ -277,7 +277,7 @@ proc semTemplSymbol(c: var TemplCtx, n: PNode, s: PSym; isField, isAmbiguous: bo else: result = newSymNode(s, n.info) if not isField: - if {openSym, templateOpenSym} * c.c.features != {}: + if openSym in c.c.features: result = newOpenSym(result) else: result.flags.incl nfDisabledOpenSym |