diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-03-01 18:33:22 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-03-01 18:33:22 -0500 |
commit | be1ad04c385fa02ff124ffe38c6b85b7dfbd2c33 (patch) | |
tree | 3cebe1786de1fa19fdfc1350f89f369cb020005c | |
parent | 2d57146b6ee86f1cbff948b98eecdc940c2f0412 (diff) | |
download | gcc-be1ad04c385fa02ff124ffe38c6b85b7dfbd2c33.zip gcc-be1ad04c385fa02ff124ffe38c6b85b7dfbd2c33.tar.gz gcc-be1ad04c385fa02ff124ffe38c6b85b7dfbd2c33.tar.bz2 |
(output_constant): Strip off some NOP_EXPRs before further processing.
From-SVN: r6683
-rw-r--r-- | gcc/varasm.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c index d4576f8..89c1bba 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -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: |