Hi, if the C++ front-end decides that something will need constructing, it will silently put the stuff into .rodata so that according pgm_read_xxx will read garbage from .progmem.
As proposed by Jason, this patch diagnoses such situations. Ok to commit? Johann PR target/81407 * config/avr/avr.c (avr_encode_section_info) [progmem && !TREE_READONLY]: Error if progmem object needs constructing.
Index: config/avr/avr.c =================================================================== --- config/avr/avr.c (revision 250093) +++ config/avr/avr.c (working copy) @@ -10380,14 +10380,22 @@ avr_encode_section_info (tree decl, rtx && !DECL_EXTERNAL (decl) && avr_progmem_p (decl, DECL_ATTRIBUTES (decl))) { - // Don't warn for (implicit) aliases like in PR80462. tree asmname = DECL_ASSEMBLER_NAME (decl); varpool_node *node = varpool_node::get_for_asmname (asmname); bool alias_p = node && node->alias; - if (!alias_p) - warning (OPT_Wuninitialized, "uninitialized variable %q+D put into " - "program memory area", decl); + if (!TREE_READONLY (decl)) + { + // This might happen with C++ if stuff needs constructing. + error ("variable %q+D with dynamic initialization put " + "into program memory area", decl); + } + else if (!alias_p) + { + // Don't warn for (implicit) aliases like in PR80462. + warning (OPT_Wuninitialized, "uninitialized variable %q+D put " + "into program memory area", decl); + } } default_encode_section_info (decl, rtl, new_decl_p);