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.)


===
Mark Millard
marklmi at yahoo.com


Reply via email to