avr_insert_attributes uses TREE_READONLY on get readonlyness of node. That does not work for C++ arrays: it gives false error "variable must be const in order to be put into read-only section by means of '__attribute__((progmem))'".
This patch peels arrays and uses TYPE_READONLY. I did not open separate PR for this, tagged it as addendum to PR44643 instead. Lightly tested on own code. There is no 'progmem' in testsuite, so from testsuite's perspective that code is dead, anyway... Johann PR target/44643 * config/avr/avr.c (avr_insert_attributes): Use TYPE_READONLY instead of TREE_READONLY.
Index: config/avr/avr.c =================================================================== --- config/avr/avr.c (revision 175629) +++ config/avr/avr.c (working copy) @@ -5030,7 +5030,19 @@ avr_insert_attributes (tree node, tree * && (TREE_STATIC (node) || DECL_EXTERNAL (node)) && avr_progmem_p (node, *attributes)) { - if (TREE_READONLY (node)) + tree node0 = node; + + /* For C++, we have to peel arrays in order to get correct + determination of readonlyness. */ + + do + node0 = TREE_TYPE (node0); + while (TREE_CODE (node0) == ARRAY_TYPE); + + if (error_mark_node == node0) + return; + + if (TYPE_READONLY (node0)) { static const char dsec[] = ".progmem.data";