aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorMike Coleman <mcoleman2@kc.rr.com>2000-10-28 00:04:11 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-10-28 00:04:11 +0000
commit63eb1269483a23914c535d12afd5b5e0f4e02391 (patch)
tree72e1c2ef417dd127c4cd13c98dac0385b812a71e /gcc/testsuite
parentae2eceaad2f95f7228e69ab5513f355e868ab787 (diff)
downloadgcc-63eb1269483a23914c535d12afd5b5e0f4e02391.zip
gcc-63eb1269483a23914c535d12afd5b5e0f4e02391.tar.gz
gcc-63eb1269483a23914c535d12afd5b5e0f4e02391.tar.bz2
c-pragma.c (handle_pragma_pack): Initialize align to -1.
2000-10-21 Mike Coleman <mcoleman2@kc.rr.com> * c-pragma.c (handle_pragma_pack): Initialize align to -1. Improve error messages. Correct parsing of #pragma pack(pop [,id]). Do not check the user-supplied alignment if we're popping. * gcc.dg/pack-test-1.c: New test case. * gcc.dg/pack-test-2.c: New test case. * gcc.dg/pack-test-1.h: New file. From-SVN: r37095
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/gcc.dg/pack-test-1.c146
-rw-r--r--gcc/testsuite/gcc.dg/pack-test-1.h12
-rw-r--r--gcc/testsuite/gcc.dg/pack-test-2.c23
3 files changed, 181 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pack-test-1.c b/gcc/testsuite/gcc.dg/pack-test-1.c
new file mode 100644
index 0000000..1ceee99
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pack-test-1.c
@@ -0,0 +1,146 @@
+/* Test semantics of #pragma pack.
+ Contributed by Mike Coleman <mcoleman2@kc.rr.com> */
+
+/* { dg-do compile { target *-*-linux* *-*-cygwin* } } */
+
+/* We only test the alignment of char, short, and int, because these
+ are the only ones that are pretty certain to be the same across
+ platforms (and maybe not even those). Mainly we're just testing
+ whether pushing and popping seem to be working correctly, and
+ verifying the (alignment == 1) case, which is really the only
+ reason anyone would use this pragma anyway.
+*/
+
+#include <stddef.h>
+
+/* gap in bytes between fields a and b in struct s */
+#define gap(s, a, b) (offsetof(struct s, a) - offsetof(struct s, b))
+/* generalized compile-time test expression */
+#define test(n, expr) int test_##n [(expr) ? 1 : -1]
+/* test a gap */
+#define testgap(n, a, b, val) test(n, gap(SNAME, a, b) == val)
+
+#define SNAME s0
+#include "pack-test-1.h"
+
+/* Save original alignment values. Can't use const ints because they
+ won't be expanded and we'll get bogus errors about variable length
+ arrays. (Possible bug in C front end?) Use s0, not SNAME, so these
+ won't change later. */
+#define al1 gap(s0, f1, f0)
+#define al2 gap(s0, f2, f1)
+#define al3 gap(s0, f3, f2)
+#define al4 gap(s0, f4, f3)
+#define al5 gap(s0, f5, f4)
+#define al6 gap(s0, f6, f5)
+#define al7 gap(s0, f7, f6)
+
+#undef SNAME
+#define SNAME s1
+#pragma pack(push, p1, 1)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(char));
+ testgap(1, f3, f2, sizeof(short));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s2
+#pragma pack(push, p2, 2)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(short));
+ testgap(1, f3, f2, sizeof(short));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s3
+#pragma pack(push, p3, 4)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(int));
+ testgap(1, f3, f2, sizeof(int));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s4
+#pragma pack(pop)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(short));
+ testgap(1, f3, f2, sizeof(short));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s5
+#pragma pack(pop, p2)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(char));
+ testgap(1, f3, f2, sizeof(short));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s6
+#pragma pack(pop, p1)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, al1);
+ testgap(1, f3, f2, al3);
+ testgap(2, f5, f4, al5);
+}
+
+#undef SNAME
+#define SNAME s7
+#pragma pack(1)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(char));
+ testgap(1, f3, f2, sizeof(short));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s8
+#pragma pack(push, p2, 2)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(short));
+ testgap(1, f3, f2, sizeof(short));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s9
+#pragma pack(pop)
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, sizeof(char));
+ testgap(1, f3, f2, sizeof(short));
+ testgap(2, f5, f4, sizeof(int));
+}
+
+#undef SNAME
+#define SNAME s10
+#pragma pack()
+#include "pack-test-1.h"
+
+void SNAME() {
+ testgap(0, f1, f0, al1);
+ testgap(1, f3, f2, al3);
+ testgap(2, f5, f4, al5);
+}
diff --git a/gcc/testsuite/gcc.dg/pack-test-1.h b/gcc/testsuite/gcc.dg/pack-test-1.h
new file mode 100644
index 0000000..f4889fa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pack-test-1.h
@@ -0,0 +1,12 @@
+/* Helper file, included repeatedly by pack-test-1.c. */
+
+struct SNAME {
+ char f0;
+ double f1;
+ short f2;
+ double f3;
+ int f4;
+ double f5;
+ double f6;
+ double f7;
+};
diff --git a/gcc/testsuite/gcc.dg/pack-test-2.c b/gcc/testsuite/gcc.dg/pack-test-2.c
new file mode 100644
index 0000000..65960ed
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pack-test-2.c
@@ -0,0 +1,23 @@
+/* Tests for syntax checking of #pragma pack.
+ Contributed by Mike Coleman <mcoleman2@kc.rr.com> */
+
+/* { dg-do compile { target *-*-linux* *-*-cygwin* } } */
+
+#pragma pack(push) /* { dg-error "malformed" } */
+#pragma pack(pop) /* { dg-error "without matching" } */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop, foo, 1) /* { dg-error "malformed" } (/
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop, bar) /* { dg-error "without matching" } */
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop)
+#pragma pack(pop, foo) /* { dg-error "without matching" } */
+
+#pragma pack(push, foo, 3) /* { dg-error "small power of two" } */
+
+extern int blah; /* prevent "ISO C forbids an empty source file" */