aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/external/c-testsuite/tests/single-exec/00210.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/external/c-testsuite/tests/single-exec/00210.c')
-rw-r--r--test/external/c-testsuite/tests/single-exec/00210.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/test/external/c-testsuite/tests/single-exec/00210.c b/test/external/c-testsuite/tests/single-exec/00210.c
new file mode 100644
index 0000000..7faeaf5
--- /dev/null
+++ b/test/external/c-testsuite/tests/single-exec/00210.c
@@ -0,0 +1,40 @@
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+
+typedef union Unaligned16a {
+ uint16_t u;
+ uint8_t b[2];
+} __attribute__((packed)) Unaligned16a;
+
+typedef union __attribute__((packed)) Unaligned16b {
+ uint16_t u;
+ uint8_t b[2];
+} Unaligned16b;
+
+extern void foo (void) __attribute__((stdcall));
+void __attribute__((stdcall)) foo (void)
+{
+}
+
+/* The actual attribute isn't important, must just be
+ parsable. */
+#define ATTR __attribute__((__noinline__))
+int ATTR actual_function() {
+ return 42;
+}
+
+extern int printf (const char *, ...);
+int main()
+{
+ void *function_pointer = &actual_function;
+
+ int a = ((ATTR int(*) (void)) function_pointer)();
+ printf("%i\n", a);
+
+ /* In the following we once misparsed 'ATTR *' is a btype
+ and hence the whole type was garbled. */
+ int b = ( (int(ATTR *)(void)) function_pointer)();
+ printf("%i\n", b);
+
+ return 0;
+}