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,

Reply via email to