aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/opt/const3.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/opt/const3.C')
-rw-r--r--gcc/testsuite/g++.dg/opt/const3.C44
1 files changed, 44 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/opt/const3.C b/gcc/testsuite/g++.dg/opt/const3.C
new file mode 100644
index 00000000000..a3539ab15c8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/const3.C
@@ -0,0 +1,44 @@
+// PR optimization/12926
+// This failed on SPARC64 because the assignments to the bit-fields
+// were wrongly swapped in the constructor.
+
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern void abort(void);
+
+typedef __SIZE_TYPE__ size_t;
+
+void *my_out;
+
+struct A
+{
+ enum Type {P, U, S};
+
+ int foo1(void *, const char *);
+ int foo2(int, const Type);
+
+ A (const size_t size, const Type type): mSize(size), mType(type)
+ {
+ foo2(foo1(my_out, "type = "), type);
+ foo2(foo1(my_out, "mType = "), mType);
+ }
+
+ const size_t mSize : 8*sizeof(size_t) - 3;
+ Type mType : 2;
+};
+
+int i;
+
+int A::foo1(void *ios, const char *str) { }
+int A::foo2(int v, const Type t) { i=0; }
+
+int main()
+{
+ A testa(2, A::S);
+
+ if (testa.mType != A::S)
+ abort();
+
+ return 0;
+}