https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118673

Iain Sandoe <iains at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |iains at gcc dot gnu.org

--- Comment #16 from Iain Sandoe <iains at gcc dot gnu.org> ---
(In reply to Jason Merrill from comment #15)
> Fixed on trunk by r15-7259-gd0f230adf0e888

This regresses obj-c++ with NeXT runtime
the previous (CONST_DECL) case contains...


      /* CONST_DECL without TREE_STATIC are enumeration values and
         thus not lvalues.  With TREE_STATIC they are used by ObjC++
         in objc_build_string_object and need to be considered as
         lvalues.  */

the CONST_DECL case then falls through into the processing for VAR_DECL, and
then tries to DECL_MERGEABLE - which ICEs because it's not a VAR.

====

perhaps:

diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc
index fb6b2b18e94..fba026d2efb 100644
--- a/gcc/cp/tree.cc
+++ b/gcc/cp/tree.cc
@@ -213,7 +213,8 @@ lvalue_kind (const_tree ref)
          && DECL_IN_AGGR_P (ref))
        return clk_none;

-      if (DECL_MERGEABLE (ref))
+      if ((TREE_CODE (ref) == CONST_DECL && TREE_STATIC (ref))
+         || DECL_MERGEABLE (ref))
        return clk_ordinary | clk_mergeable;

       /* FALLTHRU */


====

(imo) It would be useful to allow more use of CONST_DECL this way where we have
code like contracts that generates a lot of const objects - doing it manually
with read-only vars and invented local names is less obvious.  I think Richi
also has a long-term objective to use it in some way to optimise strings.

Reply via email to