Use pg_assume() to avoid compiler warning below exec_set_found()
authorAndres Freund
Wed, 9 Jul 2025 22:38:05 +0000 (18:38 -0400)
committerAndres Freund
Wed, 9 Jul 2025 22:40:54 +0000 (18:40 -0400)
The warning, visible when building with -O3 and a recent-ish gcc, is due to
gcc not realizing that found is a byvalue type and therefore will never be
interpreted as a varlena type.

Discussion: https://postgr.es/m/3prdb6hkep3duglhsujrn52bkvnlkvhc54fzvph2emrsm4vodl@77yy6j4hkemb
Discussion: https://postgr.es/m/20230316172818.x6375uvheom3ibt2%40awork3.anarazel.de
Discussion: https://postgr.es/m/20240207203138.sknifhlppdtgtxnk%40awork3.anarazel.de

src/pl/plpgsql/src/pl_exec.c

index b9acc790dc664b3cd6baff7485c77db1db86e3a4..d19425b7a71aeb959910950b1dd8fdf2d43fabb8 100644 (file)
@@ -8610,6 +8610,15 @@ exec_set_found(PLpgSQL_execstate *estate, bool state)
    PLpgSQL_var *var;
 
    var = (PLpgSQL_var *) (estate->datums[estate->found_varno]);
+
+   /*
+    * Use pg_assume() to avoid a spurious warning with some compilers, by
+    * telling the compiler that the VARATT_IS_EXTERNAL_NON_EXPANDED() branch
+    * in assign_simple_var() will never be reached when called from here, due
+    * to "found" being a boolean (i.e. a byvalue type), not a varlena.
+    */
+   pg_assume(var->datatype->typlen != -1);
+
    assign_simple_var(estate, var, BoolGetDatum(state), false, false);
 }