Index: cpukit/ChangeLog
===================================================================
--- cpukit/ChangeLog	(revision 89b897f020d281af18ebabbd189f78e338125d02)
+++ cpukit/ChangeLog	(revision 1d33ecab00b86b4eca5fa78d538b92f49e4293ed)
@@ -1,2 +1,8 @@
+2010-06-28	Joel Sherrill <joel.sherrill@oarcorp.com>
+
+	* libcsupport/include/rtems/error.h, libcsupport/src/error.c: Clean up
+	so rtems_panic() can be a noreturn method. This eliminates some
+	unreachable and thus untestable code.
+
 2010-06-28	Joel Sherrill <joel.sherrilL@OARcorp.com>
 
Index: cpukit/libcsupport/include/rtems/error.h
===================================================================
--- cpukit/libcsupport/include/rtems/error.h	(revision 89b897f020d281af18ebabbd189f78e338125d02)
+++ cpukit/libcsupport/include/rtems/error.h	(revision 1d33ecab00b86b4eca5fa78d538b92f49e4293ed)
@@ -35,20 +35,17 @@
 #endif
 
-#define RTEMS_ERROR_MASK  (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \
-                             RTEMS_ERROR_PANIC) /* all */
+#define RTEMS_ERROR_MASK \
+  (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | RTEMS_ERROR_PANIC) /* all */
 
 const char *rtems_status_text(rtems_status_code);
-int   rtems_error(rtems_error_code_t error_code, const char *printf_format, ...);
-#ifdef __GNUC__
-void  rtems_panic(const char *printf_format, ...);
-/*
- *  We should be able to use this attribute but gcc complains that
- *  rtems_panic does in fact return. :(
- *
- *      __attribute__ ((__noreturn__));
- */
-#else
-void  rtems_panic(const char *printf_format, ...);
-#endif
+int   rtems_error(
+  rtems_error_code_t error_code,
+  const char *printf_format,
+  ...
+);
+void rtems_panic(
+  const char *printf_format,
+  ...
+) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
 
 extern int rtems_panic_in_progress;
Index: cpukit/libcsupport/src/error.c
===================================================================
--- cpukit/libcsupport/src/error.c	(revision 89b897f020d281af18ebabbd189f78e338125d02)
+++ cpukit/libcsupport/src/error.c	(revision 1d33ecab00b86b4eca5fa78d538b92f49e4293ed)
@@ -17,7 +17,7 @@
  * error_flag can be specified as any of the following:
  *
- *  	RTEMS_ERROR_ERRNO       -- include errno text in output
- *  	RTEMS_ERROR_PANIC       -- halts local system after output
- *  	RTEMS_ERROR_ABORT       -- abort after output
+ *  RTEMS_ERROR_ERRNO       -- include errno text in output
+ *  RTEMS_ERROR_PANIC       -- halts local system after output
+ *  RTEMS_ERROR_ABORT       -- abort after output
  *
  * It can also include a rtems_status value which can be OR'd
@@ -25,7 +25,7 @@
  *
  * EXAMPLE
- *	#include <rtems.h>
- *	#include <rtems/error.h>
- *	rtems_error(0, "stray interrupt %d", intr);
+ *  #include <rtems.h>
+ *  #include <rtems/error.h>
+ *  rtems_error(0, "stray interrupt %d", intr);
  *
  * EXAMPLE
@@ -55,113 +55,98 @@
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>		/* _exit() */
+#include <unistd.h>     /* _exit() */
 
 int          rtems_panic_in_progress;
 
 const rtems_assoc_t rtems_status_assoc[] = {
-    { "successful completion",              RTEMS_SUCCESSFUL, 0 },
-    { "returned from a thread",             RTEMS_TASK_EXITTED, 0 },
-    { "multiprocessing not configured",     RTEMS_MP_NOT_CONFIGURED, 0 },
-    { "invalid object name",                RTEMS_INVALID_NAME, 0 },
-    { "invalid object id",                  RTEMS_INVALID_ID, 0 },
-    { "too many",                           RTEMS_TOO_MANY, 0 },
-    { "timed out waiting",                  RTEMS_TIMEOUT, 0 },
-    { "object deleted while waiting",       RTEMS_OBJECT_WAS_DELETED, 0 },
-    { "specified size was invalid",         RTEMS_INVALID_SIZE, 0 },
-    { "address specified is invalid",       RTEMS_INVALID_ADDRESS, 0 },
-    { "number was invalid",                 RTEMS_INVALID_NUMBER, 0 },
-    { "item has not been initialized",      RTEMS_NOT_DEFINED, 0 },
-    { "resources still outstanding",        RTEMS_RESOURCE_IN_USE, 0 },
-    { "request not satisfied",              RTEMS_UNSATISFIED, 0 },
-    { "thread is in wrong state",           RTEMS_INCORRECT_STATE, 0 },
-    { "thread already in state",            RTEMS_ALREADY_SUSPENDED, 0 },
-    { "illegal on calling thread",          RTEMS_ILLEGAL_ON_SELF, 0 },
-    { "illegal for remote object",          RTEMS_ILLEGAL_ON_REMOTE_OBJECT, 0 },
-    { "called from wrong environment",      RTEMS_CALLED_FROM_ISR, 0 },
-    { "invalid thread priority",            RTEMS_INVALID_PRIORITY, 0 },
-    { "invalid date/time",                  RTEMS_INVALID_CLOCK, 0 },
-    { "invalid node id",                    RTEMS_INVALID_NODE, 0 },
-    { "directive not configured",           RTEMS_NOT_CONFIGURED, 0 },
-    { "not owner of resource",              RTEMS_NOT_OWNER_OF_RESOURCE , 0 },
-    { "directive not implemented",          RTEMS_NOT_IMPLEMENTED, 0 },
-    { "RTEMS inconsistency detected",       RTEMS_INTERNAL_ERROR, 0 },
-    { "could not get enough memory",        RTEMS_NO_MEMORY, 0 },
-    { "driver IO error",                    RTEMS_IO_ERROR, 0 },
-    { "internal multiprocessing only",      THREAD_STATUS_PROXY_BLOCKING, 0 },
-    { 0, 0, 0 },
+  { "successful completion",              RTEMS_SUCCESSFUL, 0 },
+  { "returned from a thread",             RTEMS_TASK_EXITTED, 0 },
+  { "multiprocessing not configured",     RTEMS_MP_NOT_CONFIGURED, 0 },
+  { "invalid object name",                RTEMS_INVALID_NAME, 0 },
+  { "invalid object id",                  RTEMS_INVALID_ID, 0 },
+  { "too many",                           RTEMS_TOO_MANY, 0 },
+  { "timed out waiting",                  RTEMS_TIMEOUT, 0 },
+  { "object deleted while waiting",       RTEMS_OBJECT_WAS_DELETED, 0 },
+  { "specified size was invalid",         RTEMS_INVALID_SIZE, 0 },
+  { "address specified is invalid",       RTEMS_INVALID_ADDRESS, 0 },
+  { "number was invalid",                 RTEMS_INVALID_NUMBER, 0 },
+  { "item has not been initialized",      RTEMS_NOT_DEFINED, 0 },
+  { "resources still outstanding",        RTEMS_RESOURCE_IN_USE, 0 },
+  { "request not satisfied",              RTEMS_UNSATISFIED, 0 },
+  { "thread is in wrong state",           RTEMS_INCORRECT_STATE, 0 },
+  { "thread already in state",            RTEMS_ALREADY_SUSPENDED, 0 },
+  { "illegal on calling thread",          RTEMS_ILLEGAL_ON_SELF, 0 },
+  { "illegal for remote object",          RTEMS_ILLEGAL_ON_REMOTE_OBJECT, 0 },
+  { "called from wrong environment",      RTEMS_CALLED_FROM_ISR, 0 },
+  { "invalid thread priority",            RTEMS_INVALID_PRIORITY, 0 },
+  { "invalid date/time",                  RTEMS_INVALID_CLOCK, 0 },
+  { "invalid node id",                    RTEMS_INVALID_NODE, 0 },
+  { "directive not configured",           RTEMS_NOT_CONFIGURED, 0 },
+  { "not owner of resource",              RTEMS_NOT_OWNER_OF_RESOURCE , 0 },
+  { "directive not implemented",          RTEMS_NOT_IMPLEMENTED, 0 },
+  { "RTEMS inconsistency detected",       RTEMS_INTERNAL_ERROR, 0 },
+  { "could not get enough memory",        RTEMS_NO_MEMORY, 0 },
+  { "driver IO error",                    RTEMS_IO_ERROR, 0 },
+  { "internal multiprocessing only",      THREAD_STATUS_PROXY_BLOCKING, 0 },
+  { 0, 0, 0 },
 };
 
 
-const char *
-rtems_status_text(
-    rtems_status_code status
-)
-{
-    return rtems_assoc_name_by_local(rtems_status_assoc, status);
+const char *rtems_status_text(
+  rtems_status_code status
+)
+{
+  return rtems_assoc_name_by_local(rtems_status_assoc, status);
 }
 
 
 static int rtems_verror(
-    rtems_error_code_t error_flag,
-    const char   *printf_format,
-    va_list      arglist
-)
-{
-    int               local_errno = 0;
-    int               chars_written = 0;
-    rtems_status_code status;
-
-    if (error_flag & RTEMS_ERROR_PANIC)
-    {
-        if (rtems_panic_in_progress++)
-            _Thread_Disable_dispatch();       /* disable task switches */
-
-        /* don't aggravate things */
-        if (rtems_panic_in_progress > 2)
-            return 0;
-    }
-
-    (void) fflush(stdout);  	    /* in case stdout/stderr same */
-
-    status = error_flag & ~RTEMS_ERROR_MASK;
-    if (error_flag & RTEMS_ERROR_ERRNO)     /* include errno? */
-        local_errno = errno;
-
-    #if defined(RTEMS_MULTIPROCESSING)
-      if (_System_state_Is_multiprocessing)
-        fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
-    #endif
-
-    chars_written += vfprintf(stderr, printf_format, arglist);
-
-    if (status)
-        chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status));
-
-    if (local_errno)
-    {
-      if ((local_errno > 0) && *strerror(local_errno))
-        chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
-      else
-        chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
-    }
-
-    chars_written += fprintf(stderr, "\n");
-
-    (void) fflush(stderr);
-
-    if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT))
-    {
-        if (error_flag & RTEMS_ERROR_PANIC)
-        {
-            rtems_error(0, "fatal error, exiting");
-            _exit(local_errno);
-        }
-        else
-        {
-            rtems_error(0, "fatal error, aborting");
-            abort();
-        }
-    }
-    return chars_written;
+  rtems_error_code_t  error_flag,
+  const char         *printf_format,
+  va_list             arglist
+)
+{
+  int               local_errno = 0;
+  int               chars_written = 0;
+  rtems_status_code status;
+
+  if (error_flag & RTEMS_ERROR_PANIC) {
+    if (rtems_panic_in_progress++)
+      _Thread_Disable_dispatch();       /* disable task switches */
+
+    /* don't aggravate things */
+    if (rtems_panic_in_progress > 2)
+      return 0;
+  }
+
+  (void) fflush(stdout);            /* in case stdout/stderr same */
+
+  status = error_flag & ~RTEMS_ERROR_MASK;
+  if (error_flag & RTEMS_ERROR_ERRNO)     /* include errno? */
+    local_errno = errno;
+
+  #if defined(RTEMS_MULTIPROCESSING)
+    if (_System_state_Is_multiprocessing)
+      fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
+  #endif
+
+  chars_written += vfprintf(stderr, printf_format, arglist);
+
+  if (status)
+    chars_written +=
+      fprintf(stderr, " (status: %s)", rtems_status_text(status));
+
+  if (local_errno) {
+    if ((local_errno > 0) && *strerror(local_errno))
+      chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
+    else
+      chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
+  }
+
+  chars_written += fprintf(stderr, "\n");
+
+  (void) fflush(stderr);
+
+  return chars_written;
 }
 
@@ -176,17 +161,26 @@
 
 int rtems_error(
-    rtems_error_code_t error_flag,
-    const char *printf_format,
-    ...
-  )
-{
-    va_list arglist;
-    int chars_written;
-
-    va_start(arglist, printf_format);
-    chars_written = rtems_verror(error_flag, printf_format, arglist);
-    va_end(arglist);
-
-    return chars_written;
+  rtems_error_code_t error_flag,
+  const char *printf_format,
+  ...
+)
+{
+  va_list arglist;
+  int chars_written;
+
+  va_start(arglist, printf_format);
+  chars_written = rtems_verror(error_flag, printf_format, arglist);
+  va_end(arglist);
+
+  if (error_flag & RTEMS_ERROR_PANIC) {
+    rtems_error(0, "fatal error, exiting");
+    _exit(errno);
+  }
+  if (error_flag & RTEMS_ERROR_ABORT) {
+    rtems_error(0, "fatal error, aborting");
+    abort();
+  }
+
+  return chars_written;
 }
 
@@ -196,12 +190,15 @@
 
 void rtems_panic(
-    const char *printf_format,
-    ...
-  )
-{
-    va_list arglist;
-
-    va_start(arglist, printf_format);
-    (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
-    va_end(arglist);
-}
+  const char *printf_format,
+  ...
+)
+{
+  va_list arglist;
+
+  va_start(arglist, printf_format);
+  (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
+  va_end(arglist);
+
+  rtems_error(0, "fatal error, exiting");
+  _exit(errno);
+}
