summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorandri lim <jangko128@gmail.com>2017-08-03 16:03:47 +0700
committerAndreas Rumpf <rumpf_a@web.de>2017-08-03 11:03:47 +0200
commit57edf619fe4d3e826c9b8f151b0f639487ede81b (patch)
tree0cb7155fbba77008aec3e5c089f727dd7a4e1352
parentf063943d5f9015b0222b5d3c3ff9322c47b5ec6f (diff)
downloadNim-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.nim1
-rw-r--r--tests/cpp/ttypeinfo.nim17
-rw-r--r--tests/types/taliasassignment.nim50
-rw-r--r--tests/types/taliasbugs.nim158
-rw-r--r--tests/types/taliasinequality.nim66
-rw-r--r--tests/types/typeof_produces_alias.nim25
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)))