Work around a false positive compiler warning in pcm_switch_sink()

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]> Fri, 17 Apr 2026 21:57:04 -0400
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit 9dce0c32584ae60b7ed1b0d2707c06797784208c
Author: Solomon Peachy <[email protected]>
Date:   Fri Apr 17 21:42:08 2026 -0400

    Work around a false positive compiler warning in pcm_switch_sink()
    
    CC firmware/pcm.c
    firmware/pcm.c: In function ‘pcm_switch_sink’:
    firmware/pcm.c:311:38: warning: array subscript 1 is above array bounds of ‘struct pcm_sink *[1]’ [-Warray-bounds]
      311 |     struct pcm_sink* old_sink = sinks[cur_sink];
          |                                 ~~~~~^~~~~~~~~~
    firmware/pcm.c:79:25: note: while referencing ‘sinks’
       79 | static struct pcm_sink* sinks[PCM_SINK_NUM] = {
          |
    
    PCM_SINK_NUM is 1, and cur_sink is initialized to 0.  It can never be set
    above 0.  cur_sink can never be >= PCM_SINK_NUM, ie 0, but for some reason
    the compiler thinks otherwise.... sometimes.
    
    This only shows up on native ARM builds with GCC9.5.0
    
    Change-Id: I1aa731a4ee21c46a264c8b70833e3b43e777e8a7

diff --git a/firmware/export/pcm_sink.h b/firmware/export/pcm_sink.h
index 77c64428f6..24a1962189 100644
--- a/firmware/export/pcm_sink.h
+++ b/firmware/export/pcm_sink.h
@@ -52,6 +52,7 @@ struct pcm_sink {
 
 enum pcm_sink_ids {
     PCM_SINK_BUILTIN = 0,
+    PCM_SINK_NUM
 };
 
 /* defined in each platform pcm source */
diff --git a/firmware/pcm.c b/firmware/pcm.c
index 1bf0157182..25feed5a49 100644
--- a/firmware/pcm.c
+++ b/firmware/pcm.c
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include "system.h"
 #include "kernel.h"
+#include "panic.h"
 
 /* Define LOGF_ENABLE to enable logf output in this file */
 //#define LOGF_ENABLE
@@ -76,7 +77,7 @@
  *
  */
 
-static struct pcm_sink* sinks[1] = {
+static struct pcm_sink* sinks[PCM_SINK_NUM] = {
     [PCM_SINK_BUILTIN] = &builtin_pcm_sink,
 };
 static enum pcm_sink_ids cur_sink = PCM_SINK_BUILTIN;
@@ -247,7 +248,7 @@ void pcm_init(void)
 {
     logf("pcm_init");
 
-    for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) {
+    for(size_t i = 0; i < PCM_SINK_NUM; i += 1) {
         struct pcm_sink* sink = sinks[i];
         sink->pending_freq = sink->caps.default_freq;
         sink->configured_freq = -1U;
@@ -261,7 +262,7 @@ void pcm_postinit(void)
 {
     logf("pcm_postinit");
 
-    for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) {
+    for(size_t i = 0; i < PCM_SINK_NUM; i += 1) {
         struct pcm_sink* sink = sinks[i];
         sink->ops.postinit();
         sink->pcm_is_ready = true;
@@ -294,15 +295,29 @@ const struct pcm_sink_caps* pcm_current_sink_caps(void)
 bool pcm_switch_sink(enum pcm_sink_ids sink)
 {
     logf("pcm_switch_sink %d to %d", cur_sink, sink);
-    if(sink >= ARRAYLEN(sinks)) {
+    if(sink >= PCM_SINK_NUM) {
         return false;
     }
 
     if(cur_sink == sink) {
         return true;
     }
+
+    /* This should not be possible but it silences
+       a false warning that only occurs with with GCC9.5 on bare metal ARM.
+    */
+#if __GNUC__ == 9 && defined(CPU_ARM)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Warray-bounds"
+#endif
+
     /* save current sink before switching */
     struct pcm_sink* old_sink = sinks[cur_sink];
+
+#if __GNUC__ == 9
+#pragma GCC diagnostic pop
+#endif
+
     /* update sink index */
     cur_sink = sink;
     /* synchronize frequency */
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs