From 6bf704653e254a9e19b7802e240a21d4b0019235 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 13 Sep 2018 08:36:48 -0700 Subject: [PATCH 1/4] Fix returning structs from functions --- Lib/ctypes/test/test_win32.py | 18 +++ .../2018-09-13-08-29-04.bpo-34603.2AB7sc.rst | 1 + Modules/_ctypes/_ctypes_test.c | 118 ++++++++++++++++++ Modules/_ctypes/callproc.c | 4 +- Modules/_ctypes/libffi_msvc/ffi.c | 19 ++- Modules/_ctypes/libffi_msvc/ffi.h | 3 + Modules/_ctypes/libffi_msvc/prep_cif.c | 7 +- 7 files changed, 164 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2018-09-13-08-29-04.bpo-34603.2AB7sc.rst diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index 5d85ad6200b319..1482bcb8d9fa45 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -54,6 +54,24 @@ def test_noargs(self): windll.user32.GetDesktopWindow() +@unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') +class ReturnStructSizesTestCase(unittest.TestCase): + def test_sizes(self): + dll = CDLL(_ctypes_test.__file__) + for i in range(3, 9): + fields = [ (f"f{f}", c_char) for f in range(1, i + 1)] + class S(Structure): + _fields_ = fields + f = getattr(dll, f"TestSize{i}") + f.restype = S + res = f() + for i, f in enumerate(fields): + value = getattr(res, f[0]) + expected = bytes([ord('a') + i]) + self.assertEquals(value, expected) + + + @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') class TestWintypes(unittest.TestCase): def test_HWND(self): diff --git a/Misc/NEWS.d/next/Windows/2018-09-13-08-29-04.bpo-34603.2AB7sc.rst b/Misc/NEWS.d/next/Windows/2018-09-13-08-29-04.bpo-34603.2AB7sc.rst new file mode 100644 index 00000000000000..86ae1cd06171bb --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2018-09-13-08-29-04.bpo-34603.2AB7sc.rst @@ -0,0 +1 @@ +Fix returning structs from functions produced by MSVC diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 620a3c6aea6edc..3bebd6da451614 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -660,6 +660,124 @@ EXPORT(void) TwoOutArgs(int a, int *pi, int b, int *pj) *pj += b; } +#ifdef MS_WIN32 + +typedef struct { + char f1; + char f2; + char f3; +} Size3; + +typedef struct { + char f1; + char f2; + char f3; + char f4; +} Size4; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; +} Size5; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; +} Size6; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; +} Size7; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; +} Size8; + +EXPORT(Size3) TestSize3() { + Size3 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + return f; +} + +EXPORT(Size4) TestSize4() { + Size4 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + return f; +} + +EXPORT(Size5) TestSize5() { + Size5 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + return f; +} + +EXPORT(Size6) TestSize6() { + Size6 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + return f; +} + +EXPORT(Size7) TestSize7() { + Size7 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + return f; +} + +EXPORT(Size8) TestSize8() { + Size8 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + return f; +} + +#endif + #ifdef MS_WIN32 EXPORT(S2H) __stdcall s_ret_2h_func(S2H inp) { return ret_2h_func(inp); } EXPORT(S8I) __stdcall s_ret_8i_func(S8I inp) { return ret_8i_func(inp); } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index bdc372811598e5..ba154fe61b6aa2 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -715,9 +715,9 @@ ffi_type *_ctypes_get_ffi_type(PyObject *obj) It returns small structures in registers */ if (dict->ffi_type_pointer.type == FFI_TYPE_STRUCT) { - if (dict->ffi_type_pointer.size <= 4) + if (can_return_struct_as_int(dict->ffi_type_pointer.size)) return &ffi_type_sint32; - else if (dict->ffi_type_pointer.size <= 8) + else if (can_return_struct_as_sint64 (dict->ffi_type_pointer.size)) return &ffi_type_sint64; } #endif diff --git a/Modules/_ctypes/libffi_msvc/ffi.c b/Modules/_ctypes/libffi_msvc/ffi.c index 91a27dce3f2575..d202b158b07902 100644 --- a/Modules/_ctypes/libffi_msvc/ffi.c +++ b/Modules/_ctypes/libffi_msvc/ffi.c @@ -145,6 +145,21 @@ void ffi_prep_args(char *stack, extended_cif *ecif) return; } +/* +Per: https://msdn.microsoft.com/en-us/library/7572ztz4.aspx +To be returned by value in RAX, user-defined types must have a length +of 1, 2, 4, 8, 16, 32, or 64 bits +*/ +int can_return_struct_as_int(size_t s) +{ + return s == 1 || s == 2 || s == 4; +} + +int can_return_struct_as_sint64(size_t s) +{ + return s == 8; +} + /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { @@ -163,9 +178,9 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) /* MSVC returns small structures in registers. Put in cif->flags the value FFI_TYPE_STRUCT only if the structure is big enough; otherwise, put the 4- or 8-bytes integer type. */ - if (cif->rtype->size <= 4) + if (can_return_struct_as_int(cif->rtype->size)) cif->flags = FFI_TYPE_INT; - else if (cif->rtype->size <= 8) + else if (can_return_struct_as_sint64(cif->rtype->size)) cif->flags = FFI_TYPE_SINT64; else cif->flags = FFI_TYPE_STRUCT; diff --git a/Modules/_ctypes/libffi_msvc/ffi.h b/Modules/_ctypes/libffi_msvc/ffi.h index efb14c5f6f3aa1..ba74202720a652 100644 --- a/Modules/_ctypes/libffi_msvc/ffi.h +++ b/Modules/_ctypes/libffi_msvc/ffi.h @@ -136,6 +136,9 @@ typedef struct _ffi_type /*@null@*/ struct _ffi_type **elements; } ffi_type; +int can_return_struct_as_int(size_t); +int can_return_struct_as_sint64(size_t); + /* These are defined in types.c */ extern ffi_type ffi_type_void; extern ffi_type ffi_type_uint8; diff --git a/Modules/_ctypes/libffi_msvc/prep_cif.c b/Modules/_ctypes/libffi_msvc/prep_cif.c index b07a2e6db27137..022435e53fcd11 100644 --- a/Modules/_ctypes/libffi_msvc/prep_cif.c +++ b/Modules/_ctypes/libffi_msvc/prep_cif.c @@ -117,7 +117,8 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif, /* Make space for the return structure pointer */ if (cif->rtype->type == FFI_TYPE_STRUCT #ifdef _WIN32 - && (cif->rtype->size > 8) /* MSVC returns small structs in registers */ + && !can_return_struct_as_int(cif->rtype->size) /* MSVC returns small structs in registers */ + && !can_return_struct_as_sint64(cif->rtype->size) #endif #ifdef SPARC && (cif->abi != FFI_V9 || cif->rtype->size > 32) @@ -146,7 +147,9 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif, bytes += sizeof(void*); else #elif defined (_WIN64) - if ((*ptr)->type == FFI_TYPE_STRUCT && ((*ptr)->size > 8)) + if ((*ptr)->type == FFI_TYPE_STRUCT && + !can_return_struct_as_int((*ptr)->size) && + !can_return_struct_as_sint64((*ptr)->size)) bytes += sizeof(void*); else #endif From 29c1acc1e65e090f0c41a9543b12556b6aa3701f Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 14 Sep 2018 16:01:11 -0700 Subject: [PATCH 2/4] test structures with 1 and 2 fields --- Lib/ctypes/test/test_win32.py | 2 +- Modules/_ctypes/_ctypes_test.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index 1482bcb8d9fa45..84461e2ad89468 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -58,7 +58,7 @@ def test_noargs(self): class ReturnStructSizesTestCase(unittest.TestCase): def test_sizes(self): dll = CDLL(_ctypes_test.__file__) - for i in range(3, 9): + for i in range(1, 9): fields = [ (f"f{f}", c_char) for f in range(1, i + 1)] class S(Structure): _fields_ = fields diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 3bebd6da451614..abec4b92dd739a 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -662,6 +662,16 @@ EXPORT(void) TwoOutArgs(int a, int *pi, int b, int *pj) #ifdef MS_WIN32 +typedef struct { + char f1; +} Size1; + + +typedef struct { + char f1; + char f2; +} Size2; + typedef struct { char f1; char f2; @@ -713,6 +723,19 @@ typedef struct { char f8; } Size8; +EXPORT(Size1) TestSize1() { + Size1 f; + f.f1 = 'a'; + return f; +} + +EXPORT(Size2) TestSize2() { + Size2 f; + f.f1 = 'a'; + f.f2 = 'b'; + return f; +} + EXPORT(Size3) TestSize3() { Size3 f; f.f1 = 'a'; From 8449d971d49dc9b3e4de260464d2d71ea611ff74 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sat, 15 Sep 2018 09:29:35 -0700 Subject: [PATCH 3/4] increase sizes to structs in tests --- Lib/ctypes/test/test_win32.py | 2 +- Modules/_ctypes/_ctypes_test.c | 445 ++++++++++++++++++++++++++++++++- 2 files changed, 445 insertions(+), 2 deletions(-) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index 84461e2ad89468..a70c960cb1097e 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -58,7 +58,7 @@ def test_noargs(self): class ReturnStructSizesTestCase(unittest.TestCase): def test_sizes(self): dll = CDLL(_ctypes_test.__file__) - for i in range(1, 9): + for i in range(1, 21): fields = [ (f"f{f}", c_char) for f in range(1, i + 1)] class S(Structure): _fields_ = fields diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index abec4b92dd739a..0e5a50cbf97ea9 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -666,7 +666,6 @@ typedef struct { char f1; } Size1; - typedef struct { char f1; char f2; @@ -723,6 +722,216 @@ typedef struct { char f8; } Size8; +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; +} Size9; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; +} Size10; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; +} Size11; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; +} Size12; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; +} Size13; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; + char f14; +} Size14; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; + char f14; + char f15; +} Size15; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; + char f14; + char f15; + char f16; +} Size16; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; + char f14; + char f15; + char f16; + char f17; +} Size17; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; + char f14; + char f15; + char f16; + char f17; + char f18; +} Size18; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; + char f14; + char f15; + char f16; + char f17; + char f18; + char f19; +} Size19; + +typedef struct { + char f1; + char f2; + char f3; + char f4; + char f5; + char f6; + char f7; + char f8; + char f9; + char f10; + char f11; + char f12; + char f13; + char f14; + char f15; + char f16; + char f17; + char f18; + char f19; + char f20; +} Size20; + EXPORT(Size1) TestSize1() { Size1 f; f.f1 = 'a'; @@ -799,6 +1008,240 @@ EXPORT(Size8) TestSize8() { return f; } +EXPORT(Size9) TestSize9() { + Size9 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + return f; +} + +EXPORT(Size10) TestSize10() { + Size10 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + return f; +} + +EXPORT(Size11) TestSize11() { + Size11 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + return f; +} + +EXPORT(Size12) TestSize12() { + Size12 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + return f; +} + +EXPORT(Size13) TestSize13() { + Size13 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + return f; +} + +EXPORT(Size14) TestSize14() { + Size14 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + f.f14 = 'n'; + return f; +} + +EXPORT(Size15) TestSize15() { + Size15 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + f.f14 = 'n'; + f.f15 = 'o'; + return f; +} + +EXPORT(Size16) TestSize16() { + Size16 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + f.f14 = 'n'; + f.f15 = 'o'; + f.f16 = 'p'; + return f; +} + +EXPORT(Size17) TestSize17() { + Size17 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + f.f14 = 'n'; + f.f15 = 'o'; + f.f16 = 'p'; + f.f17 = 'q'; + return f; +} + +EXPORT(Size18) TestSize18() { + Size18 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + f.f14 = 'n'; + f.f15 = 'o'; + f.f16 = 'p'; + f.f17 = 'q'; + f.f18 = 'r'; + return f; +} + +EXPORT(Size19) TestSize19() { + Size19 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + f.f14 = 'n'; + f.f15 = 'o'; + f.f16 = 'p'; + f.f17 = 'q'; + f.f18 = 'r'; + f.f19 = 's'; + return f; +} + +EXPORT(Size20) TestSize20() { + Size20 f; + f.f1 = 'a'; + f.f2 = 'b'; + f.f3 = 'c'; + f.f4 = 'd'; + f.f5 = 'e'; + f.f6 = 'f'; + f.f7 = 'g'; + f.f8 = 'h'; + f.f9 = 'i'; + f.f10 = 'j'; + f.f11 = 'k'; + f.f12 = 'l'; + f.f13 = 'm'; + f.f14 = 'n'; + f.f15 = 'o'; + f.f16 = 'p'; + f.f17 = 'q'; + f.f18 = 'r'; + f.f19 = 's'; + f.f20 = 't'; + return f; +} + #endif #ifdef MS_WIN32 From 0e7fa81e547fe8d90c37af428176f1b95c303e41 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sat, 15 Sep 2018 21:19:30 -0700 Subject: [PATCH 4/4] Drop tests for sizes 11 to 20 --- Lib/ctypes/test/test_win32.py | 2 +- Modules/_ctypes/_ctypes_test.c | 390 --------------------------------- 2 files changed, 1 insertion(+), 391 deletions(-) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index a70c960cb1097e..ee722704a35d7f 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -58,7 +58,7 @@ def test_noargs(self): class ReturnStructSizesTestCase(unittest.TestCase): def test_sizes(self): dll = CDLL(_ctypes_test.__file__) - for i in range(1, 21): + for i in range(1, 11): fields = [ (f"f{f}", c_char) for f in range(1, i + 1)] class S(Structure): _fields_ = fields diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 0e5a50cbf97ea9..0152945ca1ad50 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -747,191 +747,6 @@ typedef struct { char f10; } Size10; -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; -} Size11; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; -} Size12; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; -} Size13; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; - char f14; -} Size14; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; - char f14; - char f15; -} Size15; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; - char f14; - char f15; - char f16; -} Size16; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; - char f14; - char f15; - char f16; - char f17; -} Size17; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; - char f14; - char f15; - char f16; - char f17; - char f18; -} Size18; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; - char f14; - char f15; - char f16; - char f17; - char f18; - char f19; -} Size19; - -typedef struct { - char f1; - char f2; - char f3; - char f4; - char f5; - char f6; - char f7; - char f8; - char f9; - char f10; - char f11; - char f12; - char f13; - char f14; - char f15; - char f16; - char f17; - char f18; - char f19; - char f20; -} Size20; - EXPORT(Size1) TestSize1() { Size1 f; f.f1 = 'a'; @@ -1037,211 +852,6 @@ EXPORT(Size10) TestSize10() { return f; } -EXPORT(Size11) TestSize11() { - Size11 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - return f; -} - -EXPORT(Size12) TestSize12() { - Size12 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - return f; -} - -EXPORT(Size13) TestSize13() { - Size13 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - return f; -} - -EXPORT(Size14) TestSize14() { - Size14 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - f.f14 = 'n'; - return f; -} - -EXPORT(Size15) TestSize15() { - Size15 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - f.f14 = 'n'; - f.f15 = 'o'; - return f; -} - -EXPORT(Size16) TestSize16() { - Size16 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - f.f14 = 'n'; - f.f15 = 'o'; - f.f16 = 'p'; - return f; -} - -EXPORT(Size17) TestSize17() { - Size17 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - f.f14 = 'n'; - f.f15 = 'o'; - f.f16 = 'p'; - f.f17 = 'q'; - return f; -} - -EXPORT(Size18) TestSize18() { - Size18 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - f.f14 = 'n'; - f.f15 = 'o'; - f.f16 = 'p'; - f.f17 = 'q'; - f.f18 = 'r'; - return f; -} - -EXPORT(Size19) TestSize19() { - Size19 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - f.f14 = 'n'; - f.f15 = 'o'; - f.f16 = 'p'; - f.f17 = 'q'; - f.f18 = 'r'; - f.f19 = 's'; - return f; -} - -EXPORT(Size20) TestSize20() { - Size20 f; - f.f1 = 'a'; - f.f2 = 'b'; - f.f3 = 'c'; - f.f4 = 'd'; - f.f5 = 'e'; - f.f6 = 'f'; - f.f7 = 'g'; - f.f8 = 'h'; - f.f9 = 'i'; - f.f10 = 'j'; - f.f11 = 'k'; - f.f12 = 'l'; - f.f13 = 'm'; - f.f14 = 'n'; - f.f15 = 'o'; - f.f16 = 'p'; - f.f17 = 'q'; - f.f18 = 'r'; - f.f19 = 's'; - f.f20 = 't'; - return f; -} - #endif #ifdef MS_WIN32