summaryrefslogtreecommitdiff
path: root/clang/test/CodeGen/enum.c
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/CodeGen/enum.c')
-rw-r--r--clang/test/CodeGen/enum.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/test/CodeGen/enum.c b/clang/test/CodeGen/enum.c
new file mode 100644
index 0000000..0e239f1
--- /dev/null
+++ b/clang/test/CodeGen/enum.c
@@ -0,0 +1,22 @@
+// RUN: %clang_cc1 -triple i386-unknown-unknown %s -O3 -emit-llvm -o - | grep 'ret i32 6'
+// RUN: %clang_cc1 -triple i386-unknown-unknown -x c++ %s -O3 -emit-llvm -o - | grep 'ret i32 7'
+
+// This test case illustrates a peculiarity of the promotion of
+// enumeration types in C and C++. In particular, the enumeration type
+// "z" below promotes to an unsigned int in C but int in C++.
+static enum { foo, bar = 1U } z;
+
+int main (void)
+{
+ int r = 0;
+
+ if (bar - 2 < 0)
+ r += 4;
+ if (foo - 1 < 0)
+ r += 2;
+ if (z - 1 < 0)
+ r++;
+
+ return r;
+}
+