My recent patch removing DECL_RTL from CONST_DECLs caused regressions in the ObjC++ testsuite on Darwin targets. The problem is that DECL_REGISTER was being called on CONST_DECLs; DECL_REGISTER says:
/* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'. */ #define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0) Previously, the DECL_WRTL_CHECK was succeeding when given CONST_DECLs; it no longer does. The suggested fix is to simply move the CONST_DECL case in cxx_mark_addressable; since DECL_REGISTER would have always returned false for CONST_DECLs, there's no change in functionality. Fixing DECL_REGISTER to accurately reflect its comment would be helpful, but there are other ICEs to fix if DECL_REGISTER only takes PARM_DECL and VAR_DECL; I thought it best to submit that as a separate fix, if at all. Patch was tested on Darwin targets via IainS and Dominique and fixed the regression. OK to commit? -Nathan gcc/cp/ * typeck.c (cxx_mark_addressable) [CONST_DECL]: Mark addressable and return immediately. @@ -5373,7 +5373,6 @@ cxx_mark_addressable (tree exp) || DECL_EXTERNAL (x)); /* Fall through. */ - case CONST_DECL: case RESULT_DECL: if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x) && !DECL_ARTIFICIAL (x)) @@ -5391,6 +5390,7 @@ cxx_mark_addressable (tree exp) TREE_ADDRESSABLE (x) = 1; return true; + case CONST_DECL: case FUNCTION_DECL: TREE_ADDRESSABLE (x) = 1; return true;