On Nov 29, 2025, at 12:43, Mark Millard <[email protected]> wrote:
> Dag-Erling_Smørgrav <des_at_FreeBSD.org> wrote on
> Date: Sat, 29 Nov 2025 10:38:50 UTC :
>
>> Nuno Teixeira <[email protected]> writes:
>>> I'm at main-n282229-687ab0dc54a9: Fri Nov 28 and gcc build still fails:
>>>
>>> /usr/include/sys/_types.h:164:46: error: missing binary operator before
>>> token "("
>>> 164 | #if !defined(__has_feature) || !__has_feature(capabilities)
>>> | ^
>>> gmake[3]: *** [Makefile:501: _trampoline.o] Error 1
>>
>> I know, and I don't understand why...
>>
>> what's really weird is this:
>>
>> $ x86_64-unknown-freebsd14.3-gcc13 -E sys/sys/_types.h >/dev/null
>> sys/sys/_types.h:164:46: error: missing binary operator before token "("
>> 164 | #if !defined(__has_feature) || !__has_feature(capabilities)
>> | ^
>>
>> as expected, but
>>
>> $ x86_64-unknown-freebsd14.3-gcc13 -E sys/sys/_types.h | less +Gq
>>
>> no error!
>>
>> anyway, see https://reviews.freebsd.org/D53986
>
> Interesting oddity. Getting rid of the more complicated
> original context:
>
> int main(void)
> {
> #if !defined(dog) || !dog(cat)
> return 1;
> #else
> return 0;
> #endif
> }
>
> # gcc15 gcc_undefined_macro_use_oddity.c
> gcc_undefined_macro_use_oddity.c: In function 'main':
> gcc_undefined_macro_use_oddity.c:3:26: error: missing binary operator before
> token '('
> 3 | #if !defined(dog) || !dog(cat)
> | ^
>
> Something treated by gcc as a syntax/parsing requirement before
> expression evaluation, as far as I can tell.
>
>
> That does fit with when gcc added __has_feature as far as the gcc14
> builds not failing but gcc 13 and 12 failing goes:
>
> https://gcc.gnu.org/gcc-14/changes.html reports:
>
> QUOTE
> C family
>
> The Clang language extensions __has_feature and __has_extension have been
> implemented in GCC. These are available from C, C++, and Objective-C(++).
> This is primarily intended to aid the portability of code written against
> Clang. . . .
> END QUOTE
>
>
> As for the other oddity . . .
>
> I get (looking back in the scroll history afterwards):
>
> # gcc15 gcc_undefined_macro_use_oddity.c | less +Gq
> gcc_undefined_macro_use_oddity.c: In function 'main':
> gcc_undefined_macro_use_oddity.c:3:26: error: missing binary operator before
> token '('
> 3 | #if !defined(dog) || !dog(cat)
> | ^
> ~
> ~
> ~
> . . .
> ~
> ~
> ~
> #
>
> (The error message lines were off screen before the scroll back.)
>
> For the variation below I get:
>
> # gcc15 gcc_undefined_macro_use_oddity.c 2>&1 | less +Gq
> ~
> ~
> ~
> . . .
> ~
> ~
> ~
> gcc_undefined_macro_use_oddity.c: In function 'main':
> gcc_undefined_macro_use_oddity.c:3:26: error: missing binary operator before
> token '('
> 3 | #if !defined(dog) || !dog(cat)
> | ^
> #
>
> (No scroll back needed to see the message lines.)
Hmm. System clang does the same with the small example:
# clang gcc_undefined_macro_use_oddity.c
gcc_undefined_macro_use_oddity.c:3:26: error: token is not a valid binary
operator in a preprocessor subexpression
3 | #if !defined(dog) || !dog(cat)
| ~~~~^
1 error generated.
May be not so odd? (I get to rename the example file to
not reference gcc.)
===
Mark Millard
marklmi at yahoo.com