trans.c (lvalue_required_p): Deal with character and enumeration literals as index...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 1 Jun 2015 07:51:02 +0000 (07:51 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 1 Jun 2015 07:51:02 +0000 (07:51 +0000)
* gcc-interface/trans.c (lvalue_required_p) <N_Indexed_Component>: Deal
with character and enumeration literals as index values.

From-SVN: r223913

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c

index a2887e88b0e9fbc52eba72b572596f20c0840b37..2c2b237608ec21322cfc19bffdb9a2e23508cc1a 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (lvalue_required_p) <N_Indexed_Component>: Deal
+       with character and enumeration literals as index values.
+
 2015-06-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/gigi.h (build_simple_component_ref): Declare.
index 0750051b6a08e413ceb51c2b127556d57667dc04..b561bf015a32df569742b755376d31551073d19c 100644 (file)
@@ -858,14 +858,17 @@ lvalue_required_p (Node_Id gnat_node, tree gnu_type, bool constant,
       if (Prefix (gnat_parent) != gnat_node)
        return 0;
 
-      /* ??? Consider that referencing an indexed component with a
-        non-constant index forces the whole aggregate to memory.
-        Note that N_Integer_Literal is conservative, any static
-        expression in the RM sense could probably be accepted.  */
+      /* ??? Consider that referencing an indexed component with a variable
+        index forces the whole aggregate to memory.  Note that testing only
+        for literals is conservative, any static expression in the RM sense
+        could probably be accepted with some additional work.  */
       for (gnat_temp = First (Expressions (gnat_parent));
           Present (gnat_temp);
           gnat_temp = Next (gnat_temp))
-       if (Nkind (gnat_temp) != N_Integer_Literal)
+       if (Nkind (gnat_temp) != N_Character_Literal
+           && Nkind (gnat_temp) != N_Integer_Literal
+           && !(Is_Entity_Name (gnat_temp)
+                && Ekind (Entity (gnat_temp)) == E_Enumeration_Literal))
          return 1;
 
       /* ... fall through ... */