<div dir="ltr"><div dir="ltr">Hi Sebastian,</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Dec 11, 2020 at 5:57 AM Sebastian Huber <<a href="mailto:sebastian.huber@embedded-brains.de">sebastian.huber@embedded-brains.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Expressions in static assertions must be integral constant expressions.  In<br>
integral constant expressions the use of address constant expressions is not<br>
allowed.<br>
<br>
In static initializers the address constant expressions are allowed.  Introduce<br>
a new macro _CONFIGURE_ASSERT_NOT_NULL() which leads to a compile time error if<br>
the second parameter is NULL.  It generates error messages like this if for<br>
example<br>
<br>
  #define CONFIGURE_INIT_TASK_ENTRY_POINT NULL<br>
<br>
is provided by the application:<br>
<br>
cpukit/include/rtems/confdefs/inittask.h:51:26: error: size of unnamed array is negative<br>
   51 |     ( _type ) sizeof( int[ ( _value ) != NULL ? 1 : -1 ] ) )<br>
      |                          ^<br>
cpukit/include/rtems/confdefs/inittask.h:170:3: note: in expansion of macro '_CONFIGURE_ASSERT_NOT_NULL'<br>
  170 |   _CONFIGURE_ASSERT_NOT_NULL(<br>
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~<br>
<br></blockquote><div><br></div><div>This is a nice fix. The initial error is opaque, but the macro expansion seems to be clear enough to help a user debug. Thanks</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Update #4181.<br>
---<br>
 cpukit/include/rtems/confdefs/inittask.h | 27 +++++++++++--------<br>
 cpukit/include/rtems/confdefs/wkspace.h  | 34 +++++++++++-------------<br>
 2 files changed, 32 insertions(+), 29 deletions(-)<br>
<br>
diff --git a/cpukit/include/rtems/confdefs/inittask.h b/cpukit/include/rtems/confdefs/inittask.h<br>
index d5ba521bf9..9dbf0b967b 100644<br>
--- a/cpukit/include/rtems/confdefs/inittask.h<br>
+++ b/cpukit/include/rtems/confdefs/inittask.h<br>
@@ -46,6 +46,10 @@<br>
<br>
 #ifdef CONFIGURE_INIT<br>
<br>
+#define _CONFIGURE_ASSERT_NOT_NULL( _type, _value ) \<br>
+  ( ( _value ) != NULL ? ( _value ) : \<br>
+    ( _type ) sizeof( int[ ( _value ) != NULL ? 1 : -1 ] ) )<br>
+<br></blockquote><div>Magic ;)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
 #ifdef CONFIGURE_RTEMS_INIT_TASKS_TABLE<br>
<br>
 #include <rtems/confdefs/percpu.h><br>
@@ -94,8 +98,8 @@ extern "C" {<br>
 #endif<br>
<br>
 /*<br>
- * Ignore the following warnings from g++ and clang in the static assertion<br>
- * below:<br>
+ * Ignore the following warnings from g++ and clang in the uses of<br>
+ * _CONFIGURE_ASSERT_NOT_NULL() below:<br>
  *<br>
  * warning: the address of 'void Init()' will never be NULL [-Waddress]<br>
  *<br>
@@ -107,13 +111,6 @@ extern "C" {<br>
 #pragma GCC diagnostic ignored "-Wpragmas"<br>
 #pragma GCC diagnostic ignored "-Wtautological-pointer-compare"<br>
<br>
-RTEMS_STATIC_ASSERT(<br>
-  CONFIGURE_INIT_TASK_ENTRY_POINT != NULL,<br>
-  CONFIGURE_INIT_TASK_ENTRY_POINT_MUST_NOT_BE_NULL<br>
-);<br>
-<br>
-#pragma GCC diagnostic pop<br>
-<br>
 #ifdef CONFIGURE_INIT_TASK_CONSTRUCT_STORAGE_SIZE<br>
<br>
 #ifdef CONFIGURE_INIT_TASK_STACK_SIZE<br>
@@ -139,7 +136,10 @@ const RTEMS_tasks_User_task_config _RTEMS_tasks_User_task_config = {<br>
     CONFIGURE_INIT_TASK_INITIAL_MODES,<br>
     CONFIGURE_INIT_TASK_ATTRIBUTES,<br>
   },<br>
-  CONFIGURE_INIT_TASK_ENTRY_POINT,<br>
+  _CONFIGURE_ASSERT_NOT_NULL(<br>
+    rtems_task_entry,<br>
+    CONFIGURE_INIT_TASK_ENTRY_POINT<br>
+  ),<br>
   CONFIGURE_INIT_TASK_ARGUMENTS<br>
 };<br>
<br>
@@ -167,7 +167,10 @@ const rtems_initialization_tasks_table _RTEMS_tasks_User_task_table = {<br>
   CONFIGURE_INIT_TASK_STACK_SIZE,<br>
   CONFIGURE_INIT_TASK_PRIORITY,<br>
   CONFIGURE_INIT_TASK_ATTRIBUTES,<br>
-  CONFIGURE_INIT_TASK_ENTRY_POINT,<br>
+  _CONFIGURE_ASSERT_NOT_NULL(<br>
+    rtems_task_entry,<br>
+    CONFIGURE_INIT_TASK_ENTRY_POINT<br>
+  ),<br>
   CONFIGURE_INIT_TASK_INITIAL_MODES,<br>
   CONFIGURE_INIT_TASK_ARGUMENTS<br>
 };<br>
@@ -180,6 +183,8 @@ RTEMS_SYSINIT_ITEM(<br>
<br>
 #endif /* CONFIGURE_INIT_TASK_CONSTRUCT_STORAGE_SIZE */<br>
<br>
+#pragma GCC diagnostic pop<br>
+<br>
 #ifdef __cplusplus<br>
 }<br>
 #endif<br>
diff --git a/cpukit/include/rtems/confdefs/wkspace.h b/cpukit/include/rtems/confdefs/wkspace.h<br>
index 39014d7f1d..eac4bdb4bd 100644<br>
--- a/cpukit/include/rtems/confdefs/wkspace.h<br>
+++ b/cpukit/include/rtems/confdefs/wkspace.h<br>
@@ -139,8 +139,8 @@ const uintptr_t _Stack_Space_size = _CONFIGURE_STACK_SPACE_SIZE;<br>
 #if defined(CONFIGURE_TASK_STACK_ALLOCATOR) \<br>
   && defined(CONFIGURE_TASK_STACK_DEALLOCATOR)<br>
   /*<br>
-   * Ignore the following warnings from g++ and clang in the static assertions<br>
-   * below:<br>
+   * Ignore the following warnings from g++ and clang in the uses of<br>
+   * _CONFIGURE_ASSERT_NOT_NULL() below:<br>
    *<br>
    * warning: the address of 'f()' will never be NULL [-Waddress]<br>
    *<br>
@@ -159,13 +159,11 @@ const uintptr_t _Stack_Space_size = _CONFIGURE_STACK_SPACE_SIZE;<br>
   #endif<br>
<br>
   #ifdef CONFIGURE_TASK_STACK_ALLOCATOR_INIT<br>
-    RTEMS_STATIC_ASSERT(<br>
-      CONFIGURE_TASK_STACK_ALLOCATOR_INIT != NULL,<br>
-      CONFIGURE_TASK_STACK_ALLOCATOR_INIT_MUST_NOT_BE_NULL<br>
-    );<br>
-<br>
     const Stack_Allocator_initialize _Stack_Allocator_initialize =<br>
-      CONFIGURE_TASK_STACK_ALLOCATOR_INIT;<br>
+      _CONFIGURE_ASSERT_NOT_NULL(<br>
+        Stack_Allocator_initialize,<br>
+        CONFIGURE_TASK_STACK_ALLOCATOR_INIT<br>
+      );<br>
<br>
     RTEMS_SYSINIT_ITEM(<br>
       _Stack_Allocator_do_initialize,<br>
@@ -174,21 +172,21 @@ const uintptr_t _Stack_Space_size = _CONFIGURE_STACK_SPACE_SIZE;<br>
     );<br>
   #endif<br>
<br>
-  RTEMS_STATIC_ASSERT(<br>
-    CONFIGURE_TASK_STACK_ALLOCATOR != NULL,<br>
-    CONFIGURE_TASK_STACK_ALLOCATOR_MUST_NOT_BE_NULL<br>
-  );<br>
+  Stack_Allocator_allocate CONFIGURE_TASK_STACK_ALLOCATOR_MUST_NOT_BE_NULL;<br>
<br>
   const Stack_Allocator_allocate _Stack_Allocator_allocate =<br>
-    CONFIGURE_TASK_STACK_ALLOCATOR;<br>
+    _CONFIGURE_ASSERT_NOT_NULL(<br>
+      Stack_Allocator_allocate,<br>
+      CONFIGURE_TASK_STACK_ALLOCATOR<br>
+    );<br>
<br>
-  RTEMS_STATIC_ASSERT(<br>
-    CONFIGURE_TASK_STACK_DEALLOCATOR != NULL,<br>
-    CONFIGURE_TASK_STACK_DEALLOCATOR_MUST_NOT_BE_NULL<br>
-  );<br>
+  Stack_Allocator_free CONFIGURE_TASK_STACK_DEALLOCATOR_MUST_NOT_BE_NULL;<br>
<br>
   const Stack_Allocator_free _Stack_Allocator_free =<br>
-    CONFIGURE_TASK_STACK_DEALLOCATOR;<br>
+    _CONFIGURE_ASSERT_NOT_NULL(<br>
+      Stack_Allocator_free,<br>
+      CONFIGURE_TASK_STACK_DEALLOCATOR<br>
+    );<br>
<br>
   #pragma GCC diagnostic pop<br>
 #elif defined(CONFIGURE_TASK_STACK_ALLOCATOR) \<br>
-- <br>
2.26.2<br>
<br>
_______________________________________________<br>
devel mailing list<br>
<a href="mailto:devel@rtems.org" target="_blank">devel@rtems.org</a><br>
<a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/mailman/listinfo/devel</a><br>
</blockquote></div></div>