In sem.c, typeof should be used only when not strict ANSI #1441

Closed
opened 2023-06-30 15:07:28 -05:00 by ilg-ul · 1 comment
ilg-ul commented 2023-06-30 15:07:28 -05:00 (Migrated from github.com)

When compiling sem.c, I get the following errors:

/Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c: In function 'sem_available':
/Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:21:23: error: unknown type name 'typeof'
   21 |     return *(volatile typeof(sem->permits) *) &sem->permits;
      |                       ^~~~~~
/Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:21:30: error: expected ')' before 'sem'
   21 |     return *(volatile typeof(sem->permits) *) &sem->permits;
      |                              ^~~
      |                              )
/Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:21:43: error: expected ')' before '*' token
   21 |     return *(volatile typeof(sem->permits) *) &sem->permits;
      |             ~                             ^~
      |                                           )
/Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:26:1: warning: control reaches end of non-void function [-Wreturn-type]
   26 | }
      | ^

This happens because typeof is a GNU extension, not available when the compiler is configured to be strict ANSI compliant (for example via -std=c11).

Thus, if you really want to keep the typeof, the sequence:

#ifdef __GNUC__
    return *(volatile typeof(sem->permits) *) &sem->permits;
#else
    static_assert(sizeof(sem->permits) == 2, "");
    return *(volatile int16_t *) &sem->permits;
#endif

should read:

#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
    return *(volatile typeof(sem->permits) *) &sem->permits;
#else
    static_assert(sizeof(sem->permits) == 2, "");
    return *(volatile int16_t *) &sem->permits;
#endif
When compiling `sem.c`, I get the following errors: ``` /Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c: In function 'sem_available': /Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:21:23: error: unknown type name 'typeof' 21 | return *(volatile typeof(sem->permits) *) &sem->permits; | ^~~~~~ /Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:21:30: error: expected ')' before 'sem' 21 | return *(volatile typeof(sem->permits) *) &sem->permits; | ^~~ | ) /Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:21:43: error: expected ')' before '*' token 21 | return *(volatile typeof(sem->permits) *) &sem->permits; | ~ ^~ | ) /Users/ilg/MyProjects/micro-os-plus.github/micro-os-plus-iii/micro-os-plus-iii.git/tests/build/raspberrypi-pico-cmake-debug/xpacks/@xpack-3rd-party/raspberrypi-pico-sdk/src/common/pico_sync/sem.c:26:1: warning: control reaches end of non-void function [-Wreturn-type] 26 | } | ^ ``` This happens because `typeof` is a GNU extension, not available when the compiler is configured to be strict ANSI compliant (for example via `-std=c11`). Thus, if you really want to keep the `typeof`, the sequence: ```c #ifdef __GNUC__ return *(volatile typeof(sem->permits) *) &sem->permits; #else static_assert(sizeof(sem->permits) == 2, ""); return *(volatile int16_t *) &sem->permits; #endif ``` should read: ```c #if defined(__GNUC__) && !defined(__STRICT_ANSI__) return *(volatile typeof(sem->permits) *) &sem->permits; #else static_assert(sizeof(sem->permits) == 2, ""); return *(volatile int16_t *) &sem->permits; #endif ```
kilograham commented 2024-07-20 18:33:27 -05:00 (Migrated from github.com)

seems this was fixed in 1.5.1

seems this was fixed in 1.5.1
Sign in to join this conversation.
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
gh-raspberrypi/pico-sdk#1441
No description provided.