http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50199
--- Comment #4 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-12-08 14:37:14 UTC --- Which means - taking addresses of literals should be disallowed (that includes the prominent example of STRING_CSTs, but possibly that is not the only existing case?). Instead when a literal needs its address taken it needs to be put into a CONST_DECL of which we can take the address (thus, entered into the "constant pool"). Those CONST_DECLs should be entered into the varpool so that we properly partition them with LTO. The C frontend is probably the oldest and most prominent offender of creating ADDR_EXPR <STRING_CST>. GIMPLE-side "fix": Index: gimple.c =================================================================== --- gimple.c (revision 182107) +++ gimple.c (working copy) @@ -2903,9 +2903,7 @@ is_gimple_id (tree t) return (is_gimple_variable (t) || TREE_CODE (t) == FUNCTION_DECL || TREE_CODE (t) == LABEL_DECL - || TREE_CODE (t) == CONST_DECL - /* Allow string constants, since they are addressable. */ - || TREE_CODE (t) == STRING_CST); + || TREE_CODE (t) == CONST_DECL); } (and watch it explode, obviously) Probably not 4.7 material to change though.