summary refs log tree commit diff stats
Commit message (Collapse)AuthorAgeFilesLines
* use cbuilder for seq type generation (#24202)metagn2024-10-032-40/+89
| | | | | | | | | | | | | | `addSimpleStruct` is just so the compiler doesn't use so much extra computation on analyzing the `typ` parameter for `addStruct`, which doesn't change anything for `seq` types. We could probably still get away with using `addStruct` instead, or making `addStruct` accept `nil` as the `typ` argument but this would be even more computation. There were a lot of hidden issues with `addStruct` being a template & template argument substitution, so most of the behavior is moved into `startStruct`/`finishStruct` procs. This is turning out to be a lot of code for just a couple of changed lines, we might have to split `cbuilder` into multiple modules.
* bump NimVersion to 2.2.1 (#24215)Miran2024-10-021-1/+1
|
* improve error messages for illegalCapture (#24214)ringabout2024-10-021-2/+2
| | | | | | ref https://forum.nim-lang.org/t/12536 Use a general recommendation to avoid some weird error messages like `<ref ref var Test>` etc.
* update the changelog (#24213)Miran2024-10-013-209/+239
|
* check fileExists for outputFile (#24211)ringabout2024-10-011-1/+2
| | | | ref https://github.com/nim-lang/Nim/commit/a5f46a72ba7ce074c2b32f25eaac35bba6dbe744#commitcomment-147402726
* bump NimVersion to 2.2.0 (#24210)Miran2024-09-301-2/+2
|
* fixes #24008; triggers a recompilation on output executables changes when ↵ringabout2024-09-301-2/+6
| | | | | | | | | | | | | | switching release/debug modes (#24193) fixes #24008 The old logic didn't check the contents of the output executables, when it switched release->debug->release, it picked up the Json files used in the first release building, the content of which didn't change. So it mistook the executables which are built by the second debug building as the functioning one. `changeDetectedViaJsonBuildInstructions` needs a way to distinguish the executables generated by different buildings.
* make C++ atomic opt in via -d:nimUseCppAtomics (#24209)metagn2024-09-304-4/+13
| | | | | | | refs #24207 The `-d:nimUseCAtomics` flag added in #24207 is now inverted and made into `-d:nimUseCppAtomics`, which means C++ atomics are only enabled with the define. This flag is now also documented and tested.
* remove `prev == nil` requirement for typedesc params as type nodes (#24206)metagn2024-09-302-2/+11
| | | | | | | | | | | | | | | | | | | fixes #24203 `semTypeNode` is called twice for RHS'es of type sections, [here](https://github.com/nim-lang/Nim/blob/b0e6d28782ce8c3d8e0b4a64e01f21d6f900648f/compiler/semstmts.nim#L1612) and [here](https://github.com/nim-lang/Nim/blob/b0e6d28782ce8c3d8e0b4a64e01f21d6f900648f/compiler/semstmts.nim#L1646). Each time `prev` is `s.typ`, but the assertion expects `prev == nil` which is false since `s.typ` is not nil the second time. To fix this, the `prev == nil` part of the assertion is removed. The reason this only happens for types like `seq[int]`, `(int, int)` etc is because they don't have syms: `semTypeIdent` attempts to directly [replace the typedesc param itself](https://github.com/nim-lang/Nim/blob/b0e6d28782ce8c3d8e0b4a64e01f21d6f900648f/compiler/semtypes.nim#L1916) with the sym of the base type of the resolved typedesc type if it exists, which means `semTypeNode` doesn't receive the typedesc param sym to perform the assert.
* allow C atomics on C++ with -d:nimUseCAtomics (#24207)metagn2024-09-301-25/+40
| | | | | | | | refs https://github.com/nim-lang/Nim/pull/24200#issuecomment-2382501282 Workaround for C++ Atomic[T] issues that doesn't require a compiler change. Not tested or documented in case it's not meant to be officially supported, locally tested `tatomics` and #24159 to work with it though, can add these as tests if required.
* fix logic for `dcEqIgnoreDistinct` in `sameType` (#24197)metagn2024-09-292-13/+35
| | | | | | | | | | | | | | | | | | | | | | fixes #22523 There were 2 problems with the code in `sameType` for `dcEqIgnoreDistinct`: 1. The code that skipped `{tyDistinct, tyGenericInst}` only ran if the given types had different kinds. This is fixed by always performing this skip. 2. The code block below that checks if `tyGenericInst`s have different values still ran for `dcEqIgnoreDistinct` since it checks if the given types are generic insts, not the skipped types (and also only the 1st given type). This is fixed by only invoking this block for `dcEq`; `dcEqOrDistinctOf` (which is unused) also skips the first given type. Arguably there is another issue here that `skipGenericAlias` only ever skips 1 type. These combined fix the issue (`T` is `GenericInst(V, 1, distinct int)` and `D[0]` is `GenericInst(D, 0, distinct int)`). #24037 shouldn't be a dependency but the diff follows it.
* fix cyclic node flag getting added to sink call [backport:2.0] (#24194)metagn2024-09-291-9/+10
| | | | | | | | | | | | Sorry I don't have a test case or issue for this. `injectdestructors` is supposed to add a final bool argument to `=copy` and `=dup` to mark cyclic types, as generated by `liftdestructors`. Hence this flag is added after every call to `genCopy`, but `genCopy` can generate a `=sink` call when passed the flag `IsExplicitSink` by `nkSinkAsgn`. This creates a codegen error, saying the sink received an extra argument. This is fixed by not adding the argument on the flag `IsExplicitSink`. This is a followup to #20585 which is on the 2.0 branch, hence this is marked backport.
* fix trivial segfault in sigmatch for static types (#24196)metagn2024-09-291-1/+1
| | | refs #7382, caused by #24005
* fixes #24174; allow copyDir and copyDirWithPermissions skipping special ↵ringabout2024-09-274-9/+30
| | | | | files (#24190) fixes #24174
* Revert "make default values typed in proc AST same as param sym AST" (#24191)metagn2024-09-273-54/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Reverts #24184, reopens #12942, reopens #19118 #24184 seems to have caused a regression in https://github.com/c-blake/thes and https://github.com/c-blake/bu/blob/main/rp.nim#L84 reproducible with `git clone https://github.com/c-blake/cligen; git clone https://github.com/c-blake/thes; cd thes; nim c -p=../cligen thes`. Changing the `const` to `let` makes it compile. A minimization that is probably the same issue is: ```nim const a: seq[string] = @[] proc foo(x = a) = echo typeof(x) echo x import macros macro resemFoo() = result = getImpl(bindSym"foo") block: resemFoo() # Error: cannot infer the type of parameter 'x' ``` This should be a regression test in a future reimplementation of #24184.
* use cbuilder for tuple/object generation (#24145)metagn2024-09-273-103/+153
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | based on #24127 Needs some tweaks to replace the other `struct` type generations, e.g. seqs, maybe by exposing `BaseTypeKind` as a parameter. C++ and codegenDecl etc seem like they are going to need attention. Also `Builder` should really be `distinct string` that one has to call `extract` on, but for this to be optimal in the current codegen, we would need something like: ```nim template buildInto(s: var string, builderName: untyped, body) = template `builderName`: untyped = Builder(s) body buildInto(result, builder): builder.add ... ``` but this could be a separate PR since it might not work with the compiler. The possibly-not-optimal alternative is to do: ```nim template build(builderName: untyped, body): string = var `builderName` = Builder("") body extract(`builderName`) result = build(builder): builder.add ... ``` where the compiler maybe copies the built string but shouldn't. --------- Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
* consider calling convention and iterator in getType for procs (#24181)metagn2024-09-273-6/+41
| | | | | | | | | fixes #19010 `getType` for proc types generated an `nkProcTy` for iterator types instead of `nkIteratorTy`, and didn't generate a calling convention pragma unless it was in the proc AST. Iterator types now generate `nkIteratorTy`, and a calling convention pragma is added if the calling convention isn't `closure` or was explicitly provided.
* evaluate all hidden conversions in case branches (#24187)metagn2024-09-272-5/+15
| | | | | | | | | | | | | | | fixes #11422, refs #8336/#8333, refs #20130 The compiler generates conversion nodes *after* evaluating the branches of case statements as constants, the reasoning is that case branches accept constants of different types, like arrays or sets. But this means that conversion nodes that need to be evaluated like converter calls don't get evaluated as a constant for codegen. #8336 fixed this by re-evaluating the node if an `nkHiddenCallConv` was created, and in #20130 this logic also had to be added for `nkHiddenStdConv` for cstrings. This logic was only for single case elements, it has now been added to range elements as well to fix #11422. Additionally, all conversion nodes are now evaluated for simplicity, but maybe this won't pass CI.
* improve changelogs (#24188)ringabout2024-09-271-7/+7
| | | Co-authored-by: metagn <metagngn@gmail.com>
* fixes #24175; Sink parameters not copied at compile time (#24178)ringabout2024-09-272-1/+57
| | | fixes #24175
* treat resolved symbols on RHS of module qualification as identifiers (#24180)metagn2024-09-274-3/+34
| | | | | | | | | | | | | | | | | | fixes #19866 given #23997 When searching for a module-qualified symbol, `qualifiedLookUp` tries to obtain the raw identifier from the RHS of the dot field. However it only does this when the RHS is either an `nkIdent` or an `nkAccQuoted` node, not when the node is a resolved symbol or a symchoice, such as in templates and generics when the module symbol can't be resolved yet. Since the LHS is a module symbol when the compiler checks for this, any resolved symbol information doesn't matter, since it has to be a member of the module. So we now obtain the identifier from these nodes as well as the unresolved identifier nodes. The test is a bit niche and possibly not officially supported, but this is likely a more general problem and I just couldn't think of another test that would be more "proper". It's better than the error message `'a' has no type` at least.
* make default values typed in proc AST same as param sym AST (#24184)metagn2024-09-273-2/+54
| | | | | | fixes #12942, fixes #19118 This is the exact same as #20735 but maybe the situation has improved after #24065.
* fixes #24173; always bundle checksums (#24189)ringabout2024-09-271-7/+6
| | | | | fixes #24173 `cloneDependency` always has its logic to use existing deps
* fix nimsuggest crash with arrow type sugar (#24185)metagn2024-09-273-1/+24
| | | | | | | | | fixes #24179 The original fix made it so calls to `skError`/`skUnknown` (in this case `->`, for some reason `sugar` couldn't be imported) returned an error node, however this breaks tsug_accquote for some reason I don't understand (it even parses as `tsug_accquote.discard`) so I've just added a guard based on the stacktrace.
* render float128 literals (#24182)metagn2024-09-272-0/+12
| | | | | | fixes #23639 Not sure if these are meant to be supported but it's better than crashing.
* only merge valid implicit pragmas to routine AST, include templates (#24171)metagn2024-09-266-6/+48
| | | | | | | | | | | | | fixes #19277, refs #24169, refs #18124 When pragmas are pushed to a routine, if the routine symbol AST isn't nil by the time the pushed pragmas are being processed, the pragmas are implicitly added to the symbol AST. However this is done without restriction on the pragma, if the pushed pragma isn't supposed to apply to the routine, it's still added to the routine. This is why the symbol AST for templates wasn't set before the pushed pragma processing in #18124. Now, the pragmas added to the AST are restricted to ones that apply to the given routine. This means we can set the template symbol AST earlier so that the pragmas get added to the template AST.
* sort modules and added std/setutils (#24168)Alfred Morgan2024-09-261-16/+17
|
* fixes requiresInit for var statements without initialization (#24177)ringabout2024-09-263-4/+18
| | | ref https://forum.nim-lang.org/t/12530
* fixes #24167; {.push deprecated.} for templates (#24170)ringabout2024-09-252-2/+11
| | | fixes #24167
* fix `nil` literal giving itself type `untyped`/`typed` [backport] (#24165)metagn2024-09-232-1/+7
| | | | | | | | | | | | fixes #24164, regression from #20091 The expression `nil` as the default value of template parameter `x: untyped` is typechecked with expected type `untyped` since #20091. The expected type is checked if it matches the `nil` literal with a match better than a subtype match, and the type is set to it if it does. However `untyped` matches with a generic match which is better, so the `nil` literal has type `untyped`. This breaks type matching for the literal. So if the expected type is `untyped` or `typed`, it is now ignored and the `nil` literal just has the `nil` type.
* Fix line info used for `UnunsedImport` from subdirectories (#24158)Jake Leahy2024-09-233-8/+14
| | | | | | | | | | | When importing from subdirectories, the line info used in `UnusedImport` warning would be the `/` node and not the actual module node. More obvious with grouped imports where all unused imports would show the same column ![image](https://github.com/user-attachments/assets/42850130-1e0e-46b9-bd72-54864a1ad41c) Fix is to just use the last child node for infixes when getting the line info
* fix tmarshalsegfault depending on execution time (#24153)metagn2024-09-221-3/+2
| | | | | | | | | | Added in #24119, the test checks if every string produced is equal, but the value of the strings depend on the `now()` timestamp of when they were produced. 30 of them are produced in a for loop in sequence with each other, but the first one is set after the data is marshalled into and unmarshalled from a file. This means the timestamp strings can differ depending on the execution time and causes this test to be flaky. Instead we just make 2 strings from the same data and check if they equal each other.
* fix custom pragma with backticks not working [backport] (#24151)metagn2024-09-222-3/+11
| | | refs https://forum.nim-lang.org/t/12522
* fixes #24147; Copy hook causes an incompatible-pointer-types (#24149)ringabout2024-09-222-4/+23
| | | fixes #24147
* fix `inTypeofContext` leaking after `compiles` raises exception ↵metagn2024-09-223-3/+10
| | | | | | | | | | | | | | | [backport:2.0] (#24152) fixes #24150, refs #22022 An exception is raised in the `semExprWithType` call, which means `dec c.inTypeofContext` is never called, but `compiles` allows compilation to continue. This means `c.inTypeofContext` is left perpetually nonzero, which prevents `compileTime` evaluation for the rest of the program. To fix this, `defer:` is used for the `dec c.inTypeofContext` call, as is done for [`instCounter`](https://github.com/nim-lang/Nim/blob/d51d88700b2fb3bd228d5e8f7385e2e4a2e2880c/compiler/seminst.nim#L374) in other parts of the compiler.
* Implement `removeHandler` in std/logging module (fixes #23757) (#24143)tocariimaa2024-09-201-0/+11
| | | | | | | | | | | | | Since the module allows for a handler to be added multiple times, for the sake of consistency, `removeHandler` only removes the first found instance of the handler in the `handlers` seq. So for n calls of `addHandler` using the same handler, n calls of `removeHandler` are required. fixes #23757 --------- Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
* Fix incorrect inheritance penalty for some objects (#24144)Ryan McConnell2024-09-201-1/+1
| | | | | | | | | This fixes a logic error in #23870 The inheritance penalty should be -1 if there is no inheritance relationship. Not sure how to write a test case for this one honestly. --------- Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
* fixes #24141; Calling algorithm reverse causes a SIGSEGV on ORC (#24142)ringabout2024-09-192-1/+20
| | | fixes #24141
* fix inverted order of resolved `tyFromExpr` match (#24138)metagn2024-09-192-3/+19
| | | | | | | | | | | | fixes #22276 When matching against `tyFromExpr`, the compiler tries to instantiate it then operates on the potentially instantiated type. But the way it does this is inverted, it checks if the instantiated type matches the argument type, not if the argument type matches the instantiated type. This has been the case since https://github.com/nim-lang/Nim/commit/ac271e76b18110bea8046af64ceccd6b804978dd#diff-251afcd01d239369019495096c187998dd6695b6457528953237a7e4a10f7138, which doesn't comment on it, so I'm guessing this isn't intended. I don't know if it would break anything though.
* Create `IPPROTO_NONE` alias & Add test for Unix socket (#24139)tocariimaa2024-09-194-1/+64
| | | closes #24116
* fix segfault in generic param mismatch error, skip typedesc (#24140)metagn2024-09-195-20/+44
| | | | | | | | | | | | | | refs #24010, refs https://github.com/nim-lang/Nim/issues/24125#issuecomment-2358377076 The generic mismatch errors added in #24010 made it possible for `nArg` to be `nil` in the error reporting since it checked the call argument list, not the generic parameter list for the mismatching argument node, which causes a segfault. This is fixed by checking the generic parameter list immediately on any generic mismatch error. Also the `typedesc` type is skipped for the value of the generic params since it's redundant and the generic parameter constraints don't have it.
* fix system for nimscript config files on js backend (#24135)metagn2024-09-193-2/+6
| | | | | | | | | | | fixes #21441 When compiling for JS, nimscript config files have both `defined(js)` and `defined(nimscript)` be true at the same time. This is required so that the nimscript config file knows the current compilation is for the JS backend. However the system module doesn't account for this in some cases, defining JS-specific code or not defining nimscript-specific code when compiling such nimscript files. To fix this, have the `nimscript` define take priority over the `js` one.
* fix typed case range not counting for exhaustiveness (#24136)metagn2024-09-182-0/+9
| | | | | | | | | | | | fixes #22661 Range expressions in `of` branches in `case` statements start off as calls to `..` then become `nkRange` when getting typed. For this reason the compiler leaves `nkRange` alone when type checking the case statements again, but it still does the exhaustiveness checking for the entire case statement, and leaving the range alone means it doesn't count the values of the range for exhaustiveness. So the counting is now also done on `nkRange` nodes in the same way as when typechecking it the first time.
* require `not nil` to be on the same line after a type (#24134)metagn2024-09-183-1/+14
| | | fixes #23565
* make `genericsOpenSym` work at instantiation time, new behavior in `openSym` ↵metagn2024-09-1811-28/+125
| | | | | | | | | | | | | | | | | | | | | | | | | | (#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.
* workaround for `strunicode` package no longer needed (#24132)Miran2024-09-181-1/+1
|
* make `var`/pointer types not match if base type has to be converted (#24130)metagn2024-09-187-5/+394
| | | | | | | | | | | | | | | | | | | split again from #24038, fixes https://github.com/status-im/nimbus-eth2/pull/6554#issuecomment-2354977102 `var`/pointer types are no longer implicitly convertible to each other if their element types either: * require an int conversion or another conversion operation as long as it's not to `openarray`, * are subtypes with pointer indirection, Previously any conversion below a subrange match would match if the element type wasn't a pointer type, then it would error later in `analyseIfAddressTaken`. Different from #24038 in that the preview define that made subrange matches also fail to match is removed for a simpler diff so that it can be backported.
* fixes rst parsing Markdown CodeblockFields blocking the loop (#24128)ringabout2024-09-182-1/+13
| | | | | | | | | ```nim import packages/docutils/[rst, rstgen] let message = """```llvm-profdata""" echo rstgen.rstToHtml(message, {roSupportMarkdown}, nil) ```
* revert second argument of `inc` not being generic (#24129)metagn2024-09-173-5/+11
| | | | refs #22328, fixes regression in https://forum.nim-lang.org/t/12465#76998
* fix segfault in effect tracking for sym node with nil type (#24114)metagn2024-09-172-1/+20
| | | | | | | | | | | | | | | | | | | | | | | | | fixes #24112 Sym nodes in templates that could be open are [given `nil` type](https://github.com/nim-lang/Nim/blob/22d2cf217597468ace8ba540d6990b1f6d8a816a/compiler/semtempl.nim#L274) when `--experimentalOpenSym` is disabled so that they can be semchecked to give a warning since #24007. The first nodes of object constructors (in this case) and in type conversions don't replace their first node (the symbol) with a typechecked one, they only call `semTypeNode` on it and leave it as is. Effect tracking checks if the type of a sym node has a destructor to check if the node type should be replaced with the sym type. But this causes a segfault when the type of the node is nil. To fix this, we always set the node type to the sym type if the node type is nil. Alternatively `semObjConstr` and `semConv` could be changed to set the type of their first node to the found type but I'm not sure if this would break anything. They could call `semExprWithType` on the first node but `semTypeNode` would still have to be called (maybe call it before?). This isn't a problem if the sym node has a type but is just nested in `nkOpenSym` or `nkOpenSymChoice` which have nil type instead (i.e. with openSym enabled), so maybe this still is the "most general" solution, I don't know.