aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/compatible-enum-types.c3
-rw-r--r--tests/compatible-enum-types.qbe1
-rw-r--r--type.c4
3 files changed, 8 insertions, 0 deletions
diff --git a/tests/compatible-enum-types.c b/tests/compatible-enum-types.c
new file mode 100644
index 0000000..e320966
--- /dev/null
+++ b/tests/compatible-enum-types.c
@@ -0,0 +1,3 @@
+enum E {A = -1, B};
+enum E x;
+int x;
diff --git a/tests/compatible-enum-types.qbe b/tests/compatible-enum-types.qbe
new file mode 100644
index 0000000..7cf0e40
--- /dev/null
+++ b/tests/compatible-enum-types.qbe
@@ -0,0 +1 @@
+export data $x = align 4 { z 4 }
diff --git a/type.c b/type.c
index 74e7094..79c2454 100644
--- a/type.c
+++ b/type.c
@@ -161,6 +161,10 @@ typecompatible(struct type *t1, struct type *t2)
if (t1->kind != t2->kind)
return false;
switch (t1->kind) {
+ case TYPEBASIC:
+ /* enum types are compatible with 'int', but not with
+ each other (unless they are the same type) */
+ return t1->basic.kind == t2->basic.kind && (t1 == &typeint || t2 == &typeint);
case TYPEQUALIFIED:
if (t1->qualified.kind != t2->qualified.kind)
return false;