pgsql: Change copyObject() to use typeof_unqual

From: Peter Eisentraut <peter(at)eisentraut(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Change copyObject() to use typeof_unqual
Date: 2026-03-13 06:14:38
Message-ID: E1w0vnC-003iy8-2M@gemulon.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Change copyObject() to use typeof_unqual

Currently, when the argument of copyObject() is const-qualified, the
return type is also, because the use of typeof carries over all the
qualifiers. This is incorrect, since the point of copyObject() is to
make a copy to mutate. But apparently no code ran into it.

The new implementation uses typeof_unqual, which drops the qualifiers,
making this work correctly.

typeof_unqual is standardized in C23, but all recent versions of all
the usual compilers support it even in non-C23 mode, at least as
__typeof_unqual__. We add a configure/meson test for typeof_unqual
and __typeof_unqual__ and use it if it's available, else we use the
existing fallback of just returning void *.

This is the second attempt, after the first attempt in commit
4cfce4e62c8 was reverted. The following two points address problems
with the earlier version:

We test the underscore variant first so that there is a higher chance
that clang used for bitcode also supports it, since we don't test that
separately.

Unlike the typeof test, the typeof_unqual test also tests with a void
pointer similar to how copyObject() would use it, because that is not
handled by MSVC, so we want the test to fail there.

Reviewed-by: David Geier <geidav(dot)pg(at)gmail(dot)com>
Reviewed-by: Jelte Fennema-Nio <postgres(at)jeltef(dot)nl>
Discussion: https://www.postgresql.org/message-id/flat/92f9750f-c7f6-42d8-9a4a-85a3cbe808f3%40eisentraut.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/59292f7aac72305f8e47f19155e6c7e0a070acb9

Modified Files
--------------
config/c-compiler.m4 | 65 +++++++++++++
configure | 108 +++++++++++++++++++++
configure.ac | 2 +
meson.build | 62 ++++++++++++
src/include/c.h | 12 +++
src/include/nodes/nodes.h | 4 +-
src/include/pg_config.h.in | 14 +++
.../test_cplusplusext/test_cplusplusext.cpp | 3 +-
8 files changed, 267 insertions(+), 3 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Michael Paquier 2026-03-13 07:07:37 pgsql: xml2: Fix failure with xslt_process() under -fsanitize=undefined
Previous Message Michael Paquier 2026-03-13 01:48:58 pgsql: pgstattuple: Optimize btree and hash index functions with stream