C11 / VS 2019 - Mailing list pgsql-hackers

From Peter Eisentraut
Subject C11 / VS 2019
Date
Msg-id 01a69441-af54-4822-891b-ca28e05b215a@eisentraut.org
Whole thread Raw
List pgsql-hackers
I propose that we raise the baseline C standard for PostgreSQL to C11 
for PostgreSQL 19.  This will allow us to make use of some new features, 
clear away a bunch of backward compatibility cruft, unify use of 
compiler-specific extensions, and narrow the range of compatibility 
concerns for some efforts like improved threads support.  Most compilers 
other than older versions of MSVC (about which see below) have supported 
C11 for quite some time and most use it by default, so for most 
developers and packagers this wouldn't effectively change anything 
except removing some restrictions about what features they can use.

(I mentioned some of this in my presentation at pgconf.dev; I will 
repeat the relevant points here.  You can see my presentation at [0].)

[0]: 
https://www.pgevents.ca/events/pgconfdev2025/schedule/session/271-what-is-new-in-c-and-posix/

Here are some of the features we could use.  This is just for 
inspiration right now, these would all be separate proposals:

- alignas specifier to allow specifying larger alignments more portably, 
e.g., for direct I/O
- noreturn, already in use but would allow removing 
backwards-compatibility code
- static assertions, we currently have 12(!) different implementations 
for this, could maybe cut down to 2
- allow typedef redefinitions, to untangle header files (see for example 
recent discussion [1])
- anonymous unions, mostly aesthetic
- generic selection, for some more type safety in certain cases
- threads library (needs separate consideration, see [2])
- atomic types, to maybe simplify some of our atomics support

[1]: 
https://www.postgresql.org/message-id/f36c0a45-98cd-40b2-a7cc-f2bf02b12890@eisentraut.org
[2]: 
https://www.postgresql.org/message-id/flat/CA%2BhUKGLtmexrpMtxBRLCVePqV_dtWG-ZsEbyPrYc%2BNBB2TkNsw%40mail.gmail.com

(Note: While the term "threads" appears here, this is independent of any 
work on a multithreaded server.  It probably wouldn't hurt, but it's not 
a hard prerequisite as far as I know.)

The minimum required compiler versions for C11 support among the most 
common compilers are:
- gcc 4.6/4.7/4.9 (depending on what feature)
- clang 3.1/3.2/3.3 (depending on what feature)
- Visual Studio (VS) 2019 (2022 for threads)

I have also checked the following less common compilers:
- Oracle Developer Studio 12.6, which is in the buildfarm, supports C11 
ok (manually tested)
- Intel ICC 17.0.0 is ok (not in the buildfarm, tested on godbolt)
- AIX xlclang, which is currently not supported but might come back, 
also supports C11

I think this covers all relevant compilers.

Visual Studio details: As shown above, C11 would require VS 2019.  The 
current minimum version required by PostgreSQL 18 is VS 2015.  Can we 
move forward from that?  There isn't much data to extrapolate a VS 
version support policy from.  When MSVC support was initially added in 
PG8.3, it required VS 2005, which was just the latest at the time.  Then 
it was not changed for a long time, until PG12 required VS 2013, which 
was exactly for the C99 support.  Then it was changed once more for 
PG16, requiring VS 2015; AFAICT, this was just to be able to clean away 
some conditional C code.  I don't recall any complaints about any of 
that.  Note that PG12/VS2013 corresponds arithmetically to PG18/VS2019, 
so making a move in PG19 would be less restrictive than that previous 
change.  I'll also note that we haven't had any test coverage for 
anything older than VS 2019 for quite some time.  I also remember commit 
f9f31aa91f8, where we discovered that the code didn't build with VS 2015 
after one year, and that was two years ago, so it seems like there isn't 
too much interest in trailing edge VS versions in general.  So I feel 
comfortable moving this forward.

GCC details: The oldest gcc version that we currently need to support is 
gcc 4.8, which comes with RHEL 7.  As alluded to above, some C11 
features came later with gcc 4.9, specifically generic, threads, and 
atomics.  I think it would still be useful to move forward without those 
features.  Threads and atomics are out of scope anyway because they 
require VS >=2022, which I'm not prepared to require.  And generic, 
well, we'll just have to do without that for the moment.  We can of 
course have a separate discussion sometime about when to drop RHEL 7 
support, but it doesn't have to be a prerequisite for this.

(Both gcc pre-4.9 and MSVC pre-2019 do support thread-local storage, 
just not the C11 spelling, so this is at least on paper not a blocker 
for a multithreaded server.)

Clang details: I don't think anyone cares about clang versions that old. 
  There is a clang 4.0 in the build farm, but I don't think even that 
has any practical relevance.

I would also set the minimum supported C++ version to C++11.  This is 
the level required for, for example, static assertions (and also threads 
and atomic types), so it makes some sense to align this with the C side. 
  Compilers tend to implement C++ features before C features, so this 
wouldn't set any additional requirements on compiler versions in practice.

Summary:
1. require VS 2019
2. use C11

Thoughts?



pgsql-hackers by date:

Previous
From: Michael Paquier
Date:
Subject: Re: pgsql: postgres_fdw: Inherit the local transaction's access/deferrable
Next
From: Fujii Masao
Date:
Subject: Re: Speedup truncations of temporary relation forks