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


Reply via email to