OSDN Git Service

(output_constant): Strip off some NOP_EXPRs before further processing.
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Mar 1994 23:33:22 +0000 (23:33 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Mar 1994 23:33:22 +0000 (23:33 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@6683 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/varasm.c

index d4576f8..89c1bba 100644 (file)
@@ -3323,6 +3323,17 @@ output_constant (exp, size)
   if (size == 0)
     return;
 
+  /* Eliminate the NON_LVALUE_EXPR_EXPR that makes a cast not be an lvalue.
+     That way we get the constant (we hope) inside it.  Also, strip
+     off any NOP_EXPR that converts between two record or union types.  */
+  while ((TREE_CODE (exp) == NOP_EXPR 
+         && (TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))
+             || TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
+             || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE
+             || TREE_CODE (TREE_TYPE (exp)) == QUAL_UNION_TYPE))
+        || TREE_CODE (exp) == NON_LVALUE_EXPR)
+    exp = TREE_OPERAND (exp, 0);
+
   /* Allow a constructor with no elements for any data type.
      This means to fill the space with zeros.  */
   if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
@@ -3334,12 +3345,6 @@ output_constant (exp, size)
       return;
     }
 
-  /* Eliminate the NOP_EXPR that makes a cast not be an lvalue.
-     That way we get the constant (we hope) inside it.  */
-  if (TREE_CODE (exp) == NOP_EXPR
-      && TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0)))
-    exp = TREE_OPERAND (exp, 0);
-
   switch (code)
     {
     case CHAR_TYPE: