On Tue, Aug 29, 2023 at 11:55:48AM +1200, David Rowley wrote: > On Tue, 29 Aug 2023 at 07:37, Bruce Momjian <br...@momjian.us> wrote: > > nargs = 0; > > foreach(lc, args) > > { > > actual_arg_types[nargs++] = exprType((Node *) lfirst(lc)); > > } > > Does it still produce the warning if you form the above more like? > > nargs = list_length(args); > for (int i = 0; i < nargs; i++) > actual_arg_types[i] = exprType((Node *) list_nth(args, i)); > > I'm just not sure if it's unable to figure out if at least nargs > elements is set or if it won't be happy until all 100 elements are > set.
I applied the attached patch but got the same warning: clauses.c: In function ‘recheck_cast_function_args’: clauses.c:4297:19: warning: ‘actual_arg_types’ may be used uninitialized [-Wmaybe-uninitialized] 4297 | rettype = enforce_generic_type_consistency(actual_arg_types, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4298 | declared_arg_types, | ~~~~~~~~~~~~~~~~~~~ 4299 | nargs, | ~~~~~~ 4300 | funcform->prorettype, | ~~~~~~~~~~~~~~~~~~~~~ 4301 | false); | ~~~~~~ In file included from clauses.c:45: ../../../../src/include/parser/parse_coerce.h:82:17: note: by argument 1 of type ‘const Oid *’ {aka ‘const unsigned int *’} to ‘enforce_generic_type_consistency’ declared here 82 | extern Oid enforce_generic_type_consistency(const Oid *actual_arg_types, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clauses.c:4279:33: note: ‘actual_arg_types’ declared here 4279 | Oid actual_arg_types[FUNC_MAX_ARGS]; | ^~~~~~~~~~~~~~~~ -- Bruce Momjian <br...@momjian.us> https://momjian.us EDB https://enterprisedb.com Only you can decide what is important to you.
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index da258968b8..6cf020acef 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -4279,15 +4279,19 @@ recheck_cast_function_args(List *args, Oid result_type, Oid actual_arg_types[FUNC_MAX_ARGS]; Oid declared_arg_types[FUNC_MAX_ARGS]; Oid rettype; - ListCell *lc; +// ListCell *lc; if (list_length(args) > FUNC_MAX_ARGS) elog(ERROR, "too many function arguments"); - nargs = 0; - foreach(lc, args) - { - actual_arg_types[nargs++] = exprType((Node *) lfirst(lc)); - } +// nargs = 0; +// foreach(lc, args) +// { +// actual_arg_types[nargs++] = exprType((Node *) lfirst(lc)); +// } + nargs = list_length(args); + for (int i = 0; i < nargs; i++) + actual_arg_types[i] = exprType((Node *) list_nth(args, i)); + Assert(nargs == pronargs); memcpy(declared_arg_types, proargtypes, pronargs * sizeof(Oid)); rettype = enforce_generic_type_consistency(actual_arg_types,