https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118813

            Bug ID: 118813
           Summary: Compile error when using __OPTIMIZE__ without value
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: preprocessor
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kistlin at protonmail dot ch
  Target Milestone: ---

Hello, it's more a clarification I guess rather than a bug report.

Recently I compiled a project and got:
/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/include/avx512bwintrin.h:202:17: error:
#if with no expression
  202 | #if __OPTIMIZE__
      |                 ^

The project only defined `#define __OPTIMIZE__`.

Based on the GCC manual one could argue the define is wrong.
But on the other hand the headers use different versions of #ifdef and #if.

https://github.com/gcc-mirror/gcc/blob/846837c2406ae7a52d9123b29c13e4b8b9d14224/gcc/config/i386/avx512bwintrin.h#L202

compared to this usage

https://github.com/gcc-mirror/gcc/blob/846837c2406ae7a52d9123b29c13e4b8b9d14224/gcc/config/i386/avx512bwintrin.h#L2841

gcc --version
gcc (GCC) 14.2.1 20250128


GCC manual Section 3.7.2 Common Predefined Macros
```
__OPTIMIZE__
__OPTIMIZE_SIZE__
__NO_INLINE__
These macros describe the compilation mode. __OPTIMIZE__ is defined in all
optimizing compilations. __OPTIMIZE_SIZE__ is defined if the compiler is
optimizing for size, not speed. __NO_INLINE__ is defined if no functions will
be inlined into their callers (when not optimizing, or when inlining has been
specifically disabled by -fno-inline).
These macros cause certain GNU header files to provide optimized definitions,
using macros or inline functions, of system library functions. You should not
use these macros in any way unless you make sure that programs will execute
with the same effect whether or not they are defined. If they are defined,
their value is 1.
```

For me as a non-regular reader of the manual `If they are defined, their value
is 1.` could have two meanings.
Either whoever defines the macro has to set its value to 1.
Or if #define __OPTIMIZE__ is used, the preprocessor sets its value to 1.


See also
https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues/20#note_244143
for the same info and a minimal working example.

Could you shed some light on this? Thanks!

Reply via email to