Re: AX_CXX_COMPILE_STDCXX fails to select default C++ standard automatically

Yuri <[email protected]> Sat, 2 May 2026 19:43:11 +0500
Newsgroups gmane.comp.sysutils.autoconf.bugs
Message-ID <[email protected]>
Hi there.

Ewwwwwwww, you're was right. It hit me between the eyes - my bad ((((( 
My wrong logic here.

Must be:

dnl If the user did not specify a C++ version.
if test -z "`echo '$PRESET_CXXFLAGS' | $GREP -o -E '\\-std='`"; then
   dnl Set highest possible C++ support
   AX_CXX_COMPILE_STDCXX(20, [noext], [optional])
   if test "$HAVE_CXX20" = "0"; then
     AX_CXX_COMPILE_STDCXX(17, [noext], [optional])
   fi
   if test "$HAVE_CXX17" = "0"; then
     AX_CXX_COMPILE_STDCXX(14, [noext], [optional])
   fi
   if test "$HAVE_CXX14" = "0"; then
     AX_CXX_COMPILE_STDCXX(11, [noext], [mandatory])
   fi
fi

Now all works correctly with 2.73.

Sorry for troubles.

WBR, Yuri.

29.03.2026 22:17, Yuri пишет:
> Exactly.
>
> 29.03.2026 22:16, Sam James пишет:
>> Yuri <[email protected]> writes:
>>
>>> Sorry, I'll try to explain. Before version 2.72, the dnl code:
>> Do you mean 'before 2.73', given you said 2.72 is OK below?
>>
>>> dnl If the user did not specify a C++ version.
>>> if test -z `echo "$PRESET_CXXFLAGS" | $GREP -o -E "\\-std="`; then
>>>    dnl Set highest possible C++ support
>>>    AX_CXX_COMPILE_STDCXX(20, [noext], [optional])
>>>    if test "$HAVE_CXX20" = "0"; then
>>>      AX_CXX_COMPILE_STDCXX(17, [noext], [optional])
>>>    elif test "$HAVE_CXX17" = "0"; then
>>>      AX_CXX_COMPILE_STDCXX(14, [noext], [optional])
>>>    elif test "$HAVE_CXX14" = "0"; then
>>>      AX_CXX_COMPILE_STDCXX(11, [noext], [mandatory])
>>>    fi
>>> fi
>>>
>>> in configure.ac worked perfectly. Here, a choice is made between 
>>> four alternatives, with the -std flag set if necessary.
>>> After upgrading to 2.73, the check broke for outdated but 
>>> still-usable versions of GCC (in particular). The result is
>>> that the compiler runs without the flag, which means for gcc 5.5, 
>>> the C++98 standard is selected. This breaks the build
>>> and requires determining the compiler version (which requires more 
>>> complex code, similar to OpenSSH) and the standard's
>>> flag table.
>>
>> The relevant chances in 2.73 are:
>>
>>
>> commit 056518b94ecd487bcbefdb69046b3f52c4168222
>> Author:     Paul Eggert <[email protected]>
>> AuthorDate: Tue May 28 09:31:11 2024 -0700
>> Commit:     Paul Eggert <[email protected]>
>> CommitDate: Tue May 28 09:44:25 2024 -0700
>>
>>      AC_PROG_CXX no longer adjusts C++ language version
>>
>> commit f6522328c71a62e3d182def319167ac15c8feaa5
>> Author:     Paul Eggert <[email protected]>
>> AuthorDate: Sun May 26 09:20:56 2024 -0700
>> Commit:     Paul Eggert <[email protected]>
>> CommitDate: Sun May 26 09:24:02 2024 -0700
>>
>>      AC_PROG_CXX now tries C++23, C++20, C++17, C++14
>>
>> That top (later) commit came out of a similar discussion to the one
>> we're having here.
>>
>>> Please note that all previous versions (up to and including 2.72) 
>>> behave completely correctly. If a user wants to enforce
>>> a known version of the standard, they specify the option during 
>>> configuration. Changing behavior without warning means
>>> breaking the contract and requires significant code changes, 
>>> possibly breaking backward compatibility. Given that I can't
>>> exclude a specific version of autoconf without serious 
>>> reconfiguration tricks, my only option is to disable any use of
>>> versions newer than 2.72 or write my own compiler check macro and 
>>> set the flag. My point is that sometimes the minimum
>>> level of full standard support requires setting the flag. The user 
>>> may not be aware of this, but the compiler developers
>>> are aware, and there is a fairly reliable mechanism for detecting 
>>> this flag. Therefore, I don't understand the rationale
>>> for breaking this behavior.
>> It's still not completely clear to me how much of this is autoconf vs
>> autoconf-archive given you've not shown an autoconf-only testcase, plus
>> the versioning confusion I mention too.
>>
>> See https://marc.info/?l=autoconf&m=171691458821106&w=2 and
>> https://marc.info/?l=autoconf&m=171692427327427&w=2.
>>
>>> This is not about enforcing the latest standard, it’s about 
>>> selecting the highest fully supported standard automatically
>>> when the user provides no flags.
>>>
>> How does autoconf figure out what the highest fully supported standard
>> is, keeping in mind what I raised?
>>
>>> 29.03.2026 21:27, Sam James пишет:
>>>
>>>   Tom Lane <[email protected]> writes:
>>>
>>>   Yuri <[email protected]> writes:
>>>
>>>   Expected behavior:
>>>
>>>
>>>     * |AX_CXX_COMPILE_STDCXX| should automatically detect and use the
>>>      highest supported standard if the user does not provide any flags.
>>>
>>>
>>> Is "highest supported standard" really the right decision rule?
>>> I would personally have expected "use the compiler's default",
>>> if no other guide is available.
>>>
>>>
>>> It's actually unsafe as well, because a compiler may support newer
>>> -std=XYZ but it could be experimental at least wrt ABI. GCC does that
>>> and I think Clang does as well (at least for libstdc++, it has no
>>> choice).
>>>
>>> So, say, -std=c++26 being supported by the compiler doesn't mean it 
>>> should
>>> be used.
>>>
>>>   [...]
>>>
>>>
>>> sam