diff options
author | andri lim <jangko128@gmail.com> | 2017-08-03 16:03:47 +0700 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-08-03 11:03:47 +0200 |
commit | 57edf619fe4d3e826c9b8f151b0f639487ede81b (patch) | |
tree | 0cb7155fbba77008aec3e5c089f727dd7a4e1352 | |
parent | f063943d5f9015b0222b5d3c3ff9322c47b5ec6f (diff) | |
download | Nim-57edf619fe4d3e826c9b8f151b0f639487ede81b.tar.gz |
fixes #6016 union alias trigger bad codegen (#6117)
* fixes #6016 union alias trigger bad codegen * cpp test ok * merging some test into one file
-rw-r--r-- | compiler/ccgtypes.nim | 1 | ||||
-rw-r--r-- | tests/cpp/ttypeinfo.nim | 17 | ||||
-rw-r--r-- | tests/types/taliasassignment.nim | 50 | ||||
-rw-r--r-- | tests/types/taliasbugs.nim | 158 | ||||
-rw-r--r-- | tests/types/taliasinequality.nim | 66 | ||||
-rw-r--r-- | tests/types/typeof_produces_alias.nim | 25 |
6 files changed, 176 insertions, 141 deletions
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 322021287..e63e97e0f 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -336,6 +336,7 @@ proc getTypePre(m: BModule, typ: PType; sig: SigHash): Rope = if result == nil: result = cacheGetType(m.typeCache, sig) proc structOrUnion(t: PType): Rope = + let t = t.skipTypes({tyAlias}) (if tfUnion in t.flags: rope("union") else: rope("struct")) proc getForwardStructFormat(m: BModule): string = diff --git a/tests/cpp/ttypeinfo.nim b/tests/cpp/ttypeinfo.nim index 1529c86e9..282c682b2 100644 --- a/tests/cpp/ttypeinfo.nim +++ b/tests/cpp/ttypeinfo.nim @@ -1,5 +1,22 @@ discard """ + output: '''100''' cmd: "nim cpp $file" """ import typeinfo + +#bug #6016 +type + Onion {.union.} = object + field1: int + field2: uint64 + + Stroom = Onion + + PStroom = ptr Stroom + +proc pstruct(u: PStroom) = + echo u.field2 + +var x = Onion(field1: 100) +pstruct(x.addr) \ No newline at end of file diff --git a/tests/types/taliasassignment.nim b/tests/types/taliasassignment.nim deleted file mode 100644 index bf4fe8520..000000000 --- a/tests/types/taliasassignment.nim +++ /dev/null @@ -1,50 +0,0 @@ -discard """ - output: '''19 -(c: 0) -(c: 13) -@[(c: 11)] -@[(c: 17)]''' -""" -# bug #5238 - -type - Rgba8 = object - c: int - BlenderRgb*[ColorT] = object - -template getColorType*[C](x: typedesc[BlenderRgb[C]]): typedesc = C - -type - ColorT = getColorType(BlenderRgb[int]) - -proc setColor(c: var ColorT) = - c = 19 - -var n: ColorT -n.setColor() -echo n - -type - ColorType = getColorType(BlenderRgb[Rgba8]) - -var x: ColorType -echo x - -proc setColor(c: var ColorType) = - c = Rgba8(c: 13) - -proc setColor(c: var seq[ColorType]) = - c[0] = Rgba8(c: 11) - -proc setColorArray(c: var openArray[ColorType]) = - c[0] = Rgba8(c: 17) - -x.setColor() -echo x - -var y = @[Rgba8(c:15)] -y.setColor() -echo y - -y.setColorArray() -echo y \ No newline at end of file diff --git a/tests/types/taliasbugs.nim b/tests/types/taliasbugs.nim new file mode 100644 index 000000000..57254760a --- /dev/null +++ b/tests/types/taliasbugs.nim @@ -0,0 +1,158 @@ +discard """ + msg: '''true +true +true +true +true +true''' + output: '''true +true +true +true +true +true +R +R +R +R +19 +(c: 0) +(c: 13) +@[(c: 11)] +@[(c: 17)] +100''' +""" + +# bug #5360 +import macros + +type + Order = enum + R + OrderAlias = Order + +template getOrderTypeA(): typedesc = Order +template getOrderTypeB(): typedesc = OrderAlias + +type + OrderR = getOrderTypeA() + OrderG = getOrderTypeB() + +macro typeRep(a, b: typed): untyped = + if sameType(a, b): + echo "true" + else: + echo "false" + +template test(a, b: typedesc) = + when a is b: + echo "true" + else: + echo "false" + +test(OrderAlias, Order) +test(OrderR, Order) +test(OrderG, Order) + +test(OrderR, OrderG) +test(OrderR, OrderAlias) +test(OrderG, OrderAlias) + +typeRep(OrderAlias.R, Order.R) # true +typeRep(OrderR.R, Order.R) # true +typeRep(OrderG.R, Order.R) # true + +typeRep(OrderR.R, OrderAlias.R) # true +typeRep(OrderG.R, OrderAlias.R) # true +typeRep(OrderR.R, OrderG.R) # true + +echo OrderR.R # R +echo OrderG.R # R +echo OrderAlias.R # R +echo Order.R # R + +# bug #5238 + +type + Rgba8 = object + c: int + BlenderRgb*[ColorT] = object + +template getColorType*[C](x: typedesc[BlenderRgb[C]]): typedesc = C + +type + ColorT = getColorType(BlenderRgb[int]) + +proc setColor(c: var ColorT) = + c = 19 + +var n: ColorT +n.setColor() +echo n + +type + ColorType = getColorType(BlenderRgb[Rgba8]) + +var x: ColorType +echo x + +proc setColor(c: var ColorType) = + c = Rgba8(c: 13) + +proc setColor(c: var seq[ColorType]) = + c[0] = Rgba8(c: 11) + +proc setColorArray(c: var openArray[ColorType]) = + c[0] = Rgba8(c: 17) + +x.setColor() +echo x + +var y = @[Rgba8(c:15)] +y.setColor() +echo y + +y.setColorArray() +echo y + +#bug #6016 +type + Onion {.union.} = object + field1: int + field2: uint64 + + Stroom = Onion + + PStroom = ptr Stroom + +proc pstruct(u: PStroom) = + echo u.field2 + +var oni = Onion(field1: 100) +pstruct(oni.addr) + + +# bug #4124 + +import sequtils + +type + Foo = distinct string + +var + foo: Foo + +type + Alias = (type(foo)) +var + a: Alias + +a = foo + +when true: + var xs = @[1,2,3] + + proc asFoo(i: string): Foo = + Foo(i) + + var xx = xs.mapIt(asFoo($(it + 5))) diff --git a/tests/types/taliasinequality.nim b/tests/types/taliasinequality.nim deleted file mode 100644 index f3ecd536a..000000000 --- a/tests/types/taliasinequality.nim +++ /dev/null @@ -1,66 +0,0 @@ -discard """ - msg: '''true -true -true -true -true -true''' - output: '''true -true -true -true -true -true -R -R -R -R''' -""" - -# bug #5360 -import macros - -type - Order = enum - R - OrderAlias = Order - -template getOrderTypeA(): typedesc = Order -template getOrderTypeB(): typedesc = OrderAlias - -type - OrderR = getOrderTypeA() - OrderG = getOrderTypeB() - -macro typeRep(a, b: typed): untyped = - if sameType(a, b): - echo "true" - else: - echo "false" - -template test(a, b: typedesc) = - when a is b: - echo "true" - else: - echo "false" - -test(OrderAlias, Order) -test(OrderR, Order) -test(OrderG, Order) - -test(OrderR, OrderG) -test(OrderR, OrderAlias) -test(OrderG, OrderAlias) - -typeRep(OrderAlias.R, Order.R) # true -typeRep(OrderR.R, Order.R) # true -typeRep(OrderG.R, Order.R) # true - -typeRep(OrderR.R, OrderAlias.R) # true -typeRep(OrderG.R, OrderAlias.R) # true -typeRep(OrderR.R, OrderG.R) # true - -echo OrderR.R # R -echo OrderG.R # R -echo OrderAlias.R # R -echo Order.R # R \ No newline at end of file diff --git a/tests/types/typeof_produces_alias.nim b/tests/types/typeof_produces_alias.nim deleted file mode 100644 index 44cb00c94..000000000 --- a/tests/types/typeof_produces_alias.nim +++ /dev/null @@ -1,25 +0,0 @@ - -# bug #4124 - -import sequtils - -type - Foo = distinct string - -var - foo: Foo - -type - Alias = (type(foo)) -var - a: Alias - -a = foo - -when true: - var xs = @[1,2,3] - - proc asFoo(i: string): Foo = - Foo(i) - - var xx = xs.mapIt(asFoo($(it + 5))) |