http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53300
--- Comment #17 from David Edelsohn <dje at gcc dot gnu.org> 2012-05-11 15:44:44 UTC --- A minimal testcase: enum lc_reason { LC_ENTER = 0, LC_LEAVE, LC_RENAME, LC_RENAME_VERBATIM, LC_ENTER_MACRO }; const char * foo (enum lc_reason reason) { const char *lc_reasons_v[LC_ENTER_MACRO + 1] = { "LC_ENTER", "LC_LEAVE", "LC_RENAME", "LC_RENAME_VERBATIM", "LC_ENTER_MACRO" }; return lc_reasons_v[reason]; } Without your TREE_ASM_WRITTEN kludge, the string values of the array are not emitted in the assembly. The array referencing the strings is emitted, but the values themselves are not.