MIDL achieves this by setting the size of the inner arrays to a constant value. widl actually already handles this (but uses 0 instead of 1.)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- Note that proxy generation is still broken with this commit; the goal here is simply to separate this change from other patches.
tools/widl/parser.y | 7 ------- 1 file changed, 7 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index bf715c8..53a5ec0 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -1456,7 +1456,6 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl var_t *v = decl->var; expr_list_t *sizes = get_attrp(attrs, ATTR_SIZEIS); expr_list_t *lengs = get_attrp(attrs, ATTR_LENGTHIS); - int sizeless; expr_t *dim; type_t **ptype; array_dims_t *arr = decl ? decl->array : NULL; @@ -1551,12 +1550,8 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl v->name);
ptype = &v->type; - sizeless = FALSE; if (arr) LIST_FOR_EACH_ENTRY_REV(dim, arr, expr_t, entry) { - if (sizeless) - error_loc("%s: only the first array dimension can be unspecified\n", v->name); - if (dim->is_const) { if (dim->cval <= 0) @@ -1571,8 +1566,6 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl error_loc("%s: total array size is too large\n", v->name); } } - else - sizeless = TRUE;
*ptype = type_new_array(NULL, *ptype, FALSE, dim->is_const ? dim->cval : 0,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- In the interest of doing everything else at parse time as well.
tools/widl/parser.y | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 53a5ec0..3b99d93 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -468,8 +468,8 @@ arg: attributes decl_spec m_any_declarator { if ($2->stgclass != STG_NONE && $ ;
array: '[' expr ']' { $$ = $2; - if (!$$->is_const) - error_loc("array dimension is not an integer constant\n"); + if (!$$->is_const || $$->cval <= 0) + error_loc("array dimension is not a positive integer constant\n"); } | '[' '*' ']' { $$ = make_expr(EXPR_VOID); } | '[' ']' { $$ = make_expr(EXPR_VOID); } @@ -1554,9 +1554,6 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl { if (dim->is_const) { - if (dim->cval <= 0) - error_loc("%s: array dimension must be positive\n", v->name); - /* FIXME: should use a type_memsize that allows us to pass in a pointer size */ if (0) {
MIDL doesn't warn on this, and it's not a particularly salient mistake to make.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- tools/widl/parser.y | 12 ------------ 1 file changed, 12 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 3b99d93..1fe7129 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -1552,18 +1552,6 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl ptype = &v->type; if (arr) LIST_FOR_EACH_ENTRY_REV(dim, arr, expr_t, entry) { - if (dim->is_const) - { - /* FIXME: should use a type_memsize that allows us to pass in a pointer size */ - if (0) - { - unsigned int size = type_memsize(v->type); - - if (0xffffffffu / size < dim->cval) - error_loc("%s: total array size is too large\n", v->name); - } - } - *ptype = type_new_array(NULL, *ptype, FALSE, dim->is_const ? dim->cval : 0, dim->is_const ? NULL : dim, NULL,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- tools/widl/parser.y | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 1fe7129..36a5fae 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -1552,10 +1552,12 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl ptype = &v->type; if (arr) LIST_FOR_EACH_ENTRY_REV(dim, arr, expr_t, entry) { + /* An array is always a reference pointer unless explicitly marked otherwise + * (regardless of what the default pointer attribute is). */ *ptype = type_new_array(NULL, *ptype, FALSE, dim->is_const ? dim->cval : 0, dim->is_const ? NULL : dim, NULL, - pointer_default); + FC_RP); }
ptype = &v->type;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- This patch fixes proxy generation for pointers to arrays; however, header generation is still broken since we don't respect C precedence rules.
tools/widl/header.h | 1 - tools/widl/parser.y | 120 +++++++++++++++++++++++++++---------------------- tools/widl/widltypes.h | 2 - 3 files changed, 66 insertions(+), 57 deletions(-)
diff --git a/tools/widl/header.h b/tools/widl/header.h index 3798af0..6222a48 100644 --- a/tools/widl/header.h +++ b/tools/widl/header.h @@ -48,7 +48,6 @@ extern int need_proxy_delegation(const statement_list_t *stmts); extern int need_inline_stubs_file(const statement_list_t *stmts); extern const var_t *is_callas(const attr_list_t *list); extern void write_args(FILE *h, const var_list_t *arg, const char *name, int obj, int do_indent); -extern void write_array(FILE *h, array_dims_t *v, int field); extern const type_t* get_explicit_generic_handle_type(const var_t* var); extern const var_t *get_func_handle_var( const type_t *iface, const var_t *func, unsigned char *explicit_fc, unsigned char *implicit_fc ); diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 36a5fae..005163f 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -72,7 +72,7 @@ static attr_t *make_attr(enum attr_type type); static attr_t *make_attrv(enum attr_type type, unsigned int val); static attr_t *make_attrp(enum attr_type type, void *val); static expr_list_t *append_expr(expr_list_t *list, expr_t *expr); -static array_dims_t *append_array(array_dims_t *list, expr_t *expr); +static type_t *append_array(type_t *chain, expr_t *expr); static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl, int top); static var_list_t *set_var_types(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_list_t *decls); static ifref_list_t *append_ifref(ifref_list_t *list, ifref_t *iface); @@ -82,7 +82,7 @@ static declarator_list_t *append_declarator(declarator_list_t *list, declarator_ static declarator_t *make_declarator(var_t *var); static type_t *make_safearray(type_t *type); static typelib_t *make_library(const char *name, const attr_list_t *attrs); -static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type); +static type_t *append_chain_type(type_t *chain, type_t *type); static warning_list_t *append_warning(warning_list_t *, int);
static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs); @@ -141,7 +141,6 @@ static struct namespace *current_namespace = &global_namespace; str_list_t *str_list; expr_t *expr; expr_list_t *expr_list; - array_dims_t *array_dims; type_t *type; var_t *var; var_list_t *var_list; @@ -977,7 +976,7 @@ decl_spec_no_type:
declarator: '*' m_type_qual_list declarator %prec PPTR - { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } + { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } | callconv declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1)); else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); } | direct_declarator @@ -986,9 +985,9 @@ declarator: direct_declarator: ident { $$ = make_declarator($1); } | '(' declarator ')' { $$ = $2; } - | direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); } + | direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); } | direct_declarator '(' m_args ')' { $$ = $1; - $$->func_type = append_ptrchain_type($$->type, type_new_function($3)); + $$->func_type = append_chain_type($$->type, type_new_function($3)); $$->type = NULL; } ; @@ -996,7 +995,7 @@ direct_declarator: /* abstract declarator */ abstract_declarator: '*' m_type_qual_list m_abstract_declarator %prec PPTR - { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } + { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } | callconv m_abstract_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1)); else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); } | abstract_direct_declarator @@ -1005,7 +1004,7 @@ abstract_declarator: /* abstract declarator without accepting direct declarator */ abstract_declarator_no_direct: '*' m_type_qual_list m_any_declarator %prec PPTR - { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } + { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } | callconv m_any_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1)); else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); } ; @@ -1018,16 +1017,16 @@ m_abstract_declarator: { $$ = make_declarator(NULL); } /* abstract direct declarator */ abstract_direct_declarator: '(' abstract_declarator_no_direct ')' { $$ = $2; } - | abstract_direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); } - | array { $$ = make_declarator(NULL); $$->array = append_array($$->array, $1); } + | abstract_direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); } + | array { $$ = make_declarator(NULL); $$->type = append_array($$->type, $1); } | '(' m_args ')' { $$ = make_declarator(NULL); - $$->func_type = append_ptrchain_type($$->type, type_new_function($2)); + $$->func_type = append_chain_type($$->type, type_new_function($2)); $$->type = NULL; } | abstract_direct_declarator '(' m_args ')' { $$ = $1; - $$->func_type = append_ptrchain_type($$->type, type_new_function($3)); + $$->func_type = append_chain_type($$->type, type_new_function($3)); $$->type = NULL; } ; @@ -1035,7 +1034,7 @@ abstract_direct_declarator: /* abstract or non-abstract declarator */ any_declarator: '*' m_type_qual_list m_any_declarator %prec PPTR - { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } + { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); } | any_direct_declarator ; @@ -1043,7 +1042,7 @@ any_declarator: /* abstract or non-abstract declarator without accepting direct declarator */ any_declarator_no_direct: '*' m_type_qual_list m_any_declarator %prec PPTR - { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } + { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); } | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); } ;
@@ -1058,16 +1057,16 @@ m_any_declarator: { $$ = make_declarator(NULL); } any_direct_declarator: ident { $$ = make_declarator($1); } | '(' any_declarator_no_direct ')' { $$ = $2; } - | any_direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); } - | array { $$ = make_declarator(NULL); $$->array = append_array($$->array, $1); } + | any_direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); } + | array { $$ = make_declarator(NULL); $$->type = append_array($$->type, $1); } | '(' m_args ')' { $$ = make_declarator(NULL); - $$->func_type = append_ptrchain_type($$->type, type_new_function($2)); + $$->func_type = append_chain_type($$->type, type_new_function($2)); $$->type = NULL; } | any_direct_declarator '(' m_args ')' { $$ = $1; - $$->func_type = append_ptrchain_type($$->type, type_new_function($3)); + $$->func_type = append_chain_type($$->type, type_new_function($3)); $$->type = NULL; } ; @@ -1341,16 +1340,19 @@ static expr_list_t *append_expr(expr_list_t *list, expr_t *expr) return list; }
-static array_dims_t *append_array(array_dims_t *list, expr_t *expr) +static type_t *append_array(type_t *chain, expr_t *expr) { - if (!expr) return list; - if (!list) - { - list = xmalloc( sizeof(*list) ); - list_init( list ); - } - list_add_tail( list, &expr->entry ); - return list; + type_t *array; + + if (!expr) + return chain; + + /* An array is always a reference pointer unless explicitly marked otherwise + * (regardless of what the default pointer attribute is). */ + array = type_new_array(NULL, NULL, FALSE, expr->is_const ? expr->cval : 0, + expr->is_const ? NULL : expr, NULL, FC_RP); + + return append_chain_type(chain, array); }
static struct list type_pool = LIST_INIT(type_pool); @@ -1423,16 +1425,32 @@ static int is_allowed_range_type(const type_t *type) } }
-static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type) +static type_t *get_array_or_ptr_ref(type_t *type) { - type_t *ptrchain_type; - if (!ptrchain) - return type; - for (ptrchain_type = ptrchain; type_pointer_get_ref(ptrchain_type); ptrchain_type = type_pointer_get_ref(ptrchain_type)) - ; - assert(ptrchain_type->type_type == TYPE_POINTER); - ptrchain_type->details.pointer.ref = type; - return ptrchain; + if (is_ptr(type)) + return type_pointer_get_ref(type); + else if (is_array(type)) + return type_array_get_element(type); + return NULL; +} + +static type_t *append_chain_type(type_t *chain, type_t *type) +{ + type_t *chain_type; + + if (!chain) + return type; + for (chain_type = chain; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type)) + ; + + if (is_ptr(chain_type)) + chain_type->details.pointer.ref = type; + else if (is_array(chain_type)) + chain_type->details.array.elem = type; + else + assert(0); + + return chain; }
static warning_list_t *append_warning(warning_list_t *list, int num) @@ -1458,7 +1476,6 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl expr_list_t *lengs = get_attrp(attrs, ATTR_LENGTHIS); expr_t *dim; type_t **ptype; - array_dims_t *arr = decl ? decl->array : NULL; type_t *func_type = decl ? decl->func_type : NULL; type_t *type = decl_spec->type;
@@ -1477,13 +1494,13 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl }
/* add type onto the end of the pointers in pident->type */ - v->type = append_ptrchain_type(decl ? decl->type : NULL, type); + v->type = append_chain_type(decl ? decl->type : NULL, type); v->stgclass = decl_spec->stgclass; v->attrs = attrs;
/* check for pointer attribute being applied to non-pointer, non-array * type */ - if (!arr) + if (!is_array(v->type)) { int ptr_attr = get_attrv(v->attrs, ATTR_POINTERTYPE); const type_t *ptr = NULL; @@ -1522,12 +1539,19 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl { type_t *t = type;
- if (!is_ptr(v->type) && !arr) + if (!is_ptr(v->type) && !is_array(v->type)) error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n", v->name);
- while (is_ptr(t)) - t = type_pointer_get_ref(t); + for (;;) + { + if (is_ptr(t)) + t = type_pointer_get_ref(t); + else if (is_array(t)) + t = type_array_get_element(t); + else + break; + }
if (type_get_type(t) != TYPE_BASIC && (get_basic_fc(t) != FC_CHAR && @@ -1550,17 +1574,6 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl v->name);
ptype = &v->type; - if (arr) LIST_FOR_EACH_ENTRY_REV(dim, arr, expr_t, entry) - { - /* An array is always a reference pointer unless explicitly marked otherwise - * (regardless of what the default pointer attribute is). */ - *ptype = type_new_array(NULL, *ptype, FALSE, - dim->is_const ? dim->cval : 0, - dim->is_const ? NULL : dim, NULL, - FC_RP); - } - - ptype = &v->type; if (sizes) LIST_FOR_EACH_ENTRY(dim, sizes, expr_t, entry) { if (dim->type != EXPR_VOID) @@ -1736,7 +1749,6 @@ static declarator_t *make_declarator(var_t *var) d->var = var ? var : make_var(NULL); d->type = NULL; d->func_type = NULL; - d->array = NULL; d->bits = NULL; return d; } diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index a391964..7891a1d 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -59,7 +59,6 @@ typedef struct list expr_list_t; typedef struct list var_list_t; typedef struct list declarator_list_t; typedef struct list ifref_list_t; -typedef struct list array_dims_t; typedef struct list user_type_list_t; typedef struct list context_handle_list_t; typedef struct list generic_handle_list_t; @@ -465,7 +464,6 @@ struct _declarator_t { var_t *var; type_t *type; type_t *func_type; - array_dims_t *array; expr_t *bits;
/* parser-internal */
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- tools/widl/header.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c index e0c6d38..7681a3f 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -285,6 +285,15 @@ int needs_space_after(type_t *t) (!is_ptr(t) && (!is_array(t) || !type_array_is_decl_as_ptr(t) || t->name))); }
+static void write_pointer_left(FILE *h, type_t *ref) +{ + if (needs_space_after(ref)) + fprintf(h, " "); + if (!type_is_alias(ref) && is_array(ref) && !type_array_is_decl_as_ptr(ref)) + fprintf(h, "("); + fprintf(h, "*"); +} + void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly) { const char *name; @@ -341,10 +350,12 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly) else fprintf(h, "union %s", t->name ? t->name : ""); break; case TYPE_POINTER: + { write_type_left(h, type_pointer_get_ref(t), name_type, declonly); - fprintf(h, "%s*", needs_space_after(type_pointer_get_ref(t)) ? " " : ""); + write_pointer_left(h, type_pointer_get_ref(t)); if (is_attr(t->attrs, ATTR_CONST)) fprintf(h, "const "); break; + } case TYPE_ARRAY: if (t->name && type_array_is_decl_as_ptr(t)) fprintf(h, "%s", t->name); @@ -352,7 +363,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly) { write_type_left(h, type_array_get_element(t), name_type, declonly); if (type_array_is_decl_as_ptr(t)) - fprintf(h, "%s*", needs_space_after(type_array_get_element(t)) ? " " : ""); + write_pointer_left(h, type_array_get_element(t)); } break; case TYPE_BASIC: @@ -419,23 +430,36 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly) void write_type_right(FILE *h, type_t *t, int is_field) { if (!h) return; + if (type_is_alias(t)) return;
switch (type_get_type(t)) { case TYPE_ARRAY: - if (!type_array_is_decl_as_ptr(t)) + { + type_t *elem = type_array_get_element(t); + if (type_array_is_decl_as_ptr(t)) + { + if (!type_is_alias(elem) && is_array(elem) && !type_array_is_decl_as_ptr(elem)) + fprintf(h, ")"); + } + else { if (is_conformant_array(t)) - { fprintf(h, "[%s]", is_field ? "1" : ""); - t = type_array_get_element(t); - } - for ( ; - type_get_type(t) == TYPE_ARRAY && !type_array_is_decl_as_ptr(t); - t = type_array_get_element(t)) + else fprintf(h, "[%u]", type_array_get_dim(t)); } + write_type_right(h, elem, FALSE); break; + } + case TYPE_POINTER: + { + type_t *ref = type_pointer_get_ref(t); + if (!type_is_alias(ref) && is_array(ref) && !type_array_is_decl_as_ptr(ref)) + fprintf(h, ")"); + write_type_right(h, ref, FALSE); + break; + } case TYPE_BITFIELD: fprintf(h, " : %u", type_bitfield_get_bits(t)->cval); break; @@ -450,7 +474,6 @@ void write_type_right(FILE *h, type_t *t, int is_field) case TYPE_COCLASS: case TYPE_FUNCTION: case TYPE_INTERFACE: - case TYPE_POINTER: break; } }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/rpcrt4/tests/server.c | 14 ++++++++++++++ dlls/rpcrt4/tests/server.idl | 3 +++ 2 files changed, 17 insertions(+)
diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c index b35b71b..1494904 100644 --- a/dlls/rpcrt4/tests/server.c +++ b/dlls/rpcrt4/tests/server.c @@ -861,6 +861,16 @@ void __cdecl s_ip_test(ipu_t *a) ok(hr == S_OK, "got %#x\n", hr); }
+int __cdecl s_sum_ptr_array(int *a[2]) +{ + return *a[0] + *a[1]; +} + +int __cdecl s_sum_array_ptr(int (*a)[2]) +{ + return (*a)[0] + (*a)[1]; +} + static void make_cmdline(char buffer[MAX_PATH], const char *test) { @@ -1388,6 +1398,7 @@ array_tests(void) pints_t api[5]; numbers_struct_t *ns; refpint_t rpi[5]; + int i0 = 1, i1 = 2, *ptr_array[2] = {&i0, &i1}, array[2] = {3, 4};
if (!old_windows_version) { @@ -1518,6 +1529,9 @@ array_tests(void) pi[4] = -4; rpi[4] = &pi[4]; ok(sum_complex_array(5, rpi) == 1, "RPC sum_complex_array\n"); HeapFree(GetProcessHeap(), 0, pi); + + ok(sum_ptr_array(ptr_array) == 3, "RPC sum_ptr_array\n"); + ok(sum_array_ptr(&array) == 7, "RPC sum_array_ptr\n"); }
void __cdecl s_authinfo_test(unsigned int protseq, int secure) diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl index 6aa7382..7d89445 100644 --- a/dlls/rpcrt4/tests/server.idl +++ b/dlls/rpcrt4/tests/server.idl @@ -393,4 +393,7 @@ cpp_quote("#endif") } ipu_t;
void ip_test([in] ipu_t *a); + + int sum_ptr_array([in] int *a[2]); + int sum_array_ptr([in] int (*a)[2]); }
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=42917
Your paranoid android.
=== build (build log) ===
../../../../wine/dlls/rpcrt4/tests/server.c:869:13: error: conflicting types for ‘s_sum_array_ptr’ Makefile:400: recipe for target 'server.o' failed Makefile:7471: recipe for target 'dlls/rpcrt4/tests' failed Task: The exe32 Wine crossbuild failed