-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SIGSEGV on generic macro returning a type #8406
Comments
I should also not that this is a import macros
macro f(x: untyped): untyped =
newIdentNode("int")
proc g[X](x: f(X)) =
discard |
I don't know if it should work or not. At the moment you can generate the proc in the macro or use a wrapper type like I did in Stint. In you example that would be something like this: macro Choose(N: static[int]): untyped =
if N == 2:
return ident("MyFancyConcreteType")
else:
return nnkBracketExpr.newTree(ident("MyFancyGenericType"), newIntLitNode(N))
type MyFancyConcreteType = ...
type MyFancyGenericType[N: static[int]] = ...
type MyFancyType[N: static[int]] = object
impl: Choose[N]
var x: Choose(2) # of MyFancyConcreteType
var y: Choose(3) # of MyFancyGenericType[3]
# Generic procs may still be written
proc doSomethingWithEither[N: static[int]](v: MyFancyType[N]) = ... You should put a full working example, btw. I think your issue is linked to #7231 |
Yes, I believe you helped me implement your solution a while back. I decided I wanted to see if I could find a solution involving no wrapper types. What do you mean by a full working example? In regards to the bug, or to my intended feature? |
I meant: type MyFancyConcreteType = object
type MyFancyGenericType[N: static[int]] = object
foo: array[N, int] Instead of |
Ah, I'll be sure to keep that in mind for the future ;-) |
Tested in playground, no more sigsev, an error is produced instead: |
Early generic evaluation bug again, can link #8551 and #22607 right now but there are more related issues As described in the other issues, delegating to a generic type is a workaround macro f(x: static[int]): untyped = discard
type FWrapper[x: static int] = f(x)
proc g[X: static[int]](v: FWrapper[X]) = discard |
fixes nim-lang#8406, fixes nim-lang#8551, refs nim-lang#8545, refs nim-lang#22607
fixes nim-lang#8406, fixes nim-lang#8551, refs nim-lang#8545, refs nim-lang#22607
fixes nim-lang#8406, fixes nim-lang#8551, refs nim-lang#8545, refs nim-lang#22607
fixes nim-lang#8406, fixes nim-lang#8551, refs nim-lang#8545, refs nim-lang#22607
The following SIGSEGVs:
This is valid with the type system, though, right? Since
X
is known at compile-time it can be used to generate a type forv
? I want to do something like this:Is this possible, SIGSEGV or no; should I abandon the idea?
The text was updated successfully, but these errors were encountered: