[Bug 255290] _POSIX_C_SOURCE=200809 hides static_assert

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Wed Apr 21 06:22:38 UTC 2021


            Bug ID: 255290
           Summary: _POSIX_C_SOURCE=200809 hides static_assert
           Product: Base System
           Version: Unspecified
          Hardware: Any
               URL: https://github.com/gbdev/rgbds/issues/789
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: standards
          Assignee: standards at FreeBSD.org
          Reporter: tobik at freebsd.org

$ cat test.c <<EOF
#include <assert.h>
int main() { static_assert(1 == 1, ""); }
$ cc -D_POSIX_C_SOURCE=200809L -std=gnu11 test.c
test.c:2:14: warning: implicit declaration of function 'static_assert' is
invalid in C99 [-Wimplicit-function-declaration]
int main() { static_assert(1 == 1, ""); }
1 warning generated.
ld: error: undefined symbol: static_assert
>>> referenced by test.c
>>>               /tmp/test-8e234d.o:(main)
cc: error: linker command failed with exit code 1 (use -v to see invocation)

This affects devel/rgbds where I had to remove _POSIX_C_SOURCE.

In assert.h we have:
#if __ISO_C_VISIBLE >= 2011 && !defined(__cplusplus)
#define static_assert   _Static_assert

In sys/cdefs.h we have:
#if _POSIX_C_SOURCE >= 200809
#define __POSIX_VISIBLE         200809
#define __ISO_C_VISIBLE         1999

so static_assert is hidden when _POSIX_C_SOURCE=200809L because
__ISO_C_VISIBLE is clamped to 1999.  I've reported this upstream
but we have found no evidence that POSIX 2008 mandates C99 and
should hide static_assert.

On Linux with musl and glibc and OpenBSD this works fine.

OpenBSD uses __STDC_VERSION__ instead of __ISO_C_VISIBLE
in assert.h which might be the more correct choice.

You are receiving this mail because:
You are the assignee for the bug.

More information about the freebsd-standards mailing list