aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@marvell.com>2023-03-23 02:10:11 +0000
committerAndrew Pinski <apinski@marvell.com>2023-03-23 17:24:59 +0000
commit80ed2a6471a39dd95192a334789fd63d5efd2e8a (patch)
tree2681dc02319228dd54f6f5bdec4655fae109d255
parent5ededfa5b23781c3be6fcf6bb373418aa8bd6541 (diff)
downloadgcc-80ed2a6471a39dd95192a334789fd63d5efd2e8a.zip
gcc-80ed2a6471a39dd95192a334789fd63d5efd2e8a.tar.gz
gcc-80ed2a6471a39dd95192a334789fd63d5efd2e8a.tar.bz2
c: [PR84900] cast of compound literal does not cause the code to become a non-lvalue
The problem here is after r0-92187-g2ec5deb5c3146c, maybe_lvalue_p would return false for compound literals which causes non_lvalue_loc not to wrap the expression with a NON_LVALUE_EXPR unlike before when it return true as it returns true for all language specific tree codes. This fixes that oversight and fixes the testcase to have the cast as a non-lvalue. Committed to the trunk as obvious after a bootstrap/test on x86_64-linux-gnu. PR c/84900 gcc/ChangeLog: * fold-const.cc (maybe_lvalue_p): Treat COMPOUND_LITERAL_EXPR as a lvalue. gcc/testsuite/ChangeLog: * gcc.dg/compound-literal-cast-lvalue-1.c: New test.
-rw-r--r--gcc/fold-const.cc1
-rw-r--r--gcc/testsuite/gcc.dg/compound-literal-cast-lvalue-1.c9
2 files changed, 10 insertions, 0 deletions
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index 02a24c5..5b9982e 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -2646,6 +2646,7 @@ maybe_lvalue_p (const_tree x)
case LABEL_DECL:
case FUNCTION_DECL:
case SSA_NAME:
+ case COMPOUND_LITERAL_EXPR:
case COMPONENT_REF:
case MEM_REF:
diff --git a/gcc/testsuite/gcc.dg/compound-literal-cast-lvalue-1.c b/gcc/testsuite/gcc.dg/compound-literal-cast-lvalue-1.c
new file mode 100644
index 0000000..729bae2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compound-literal-cast-lvalue-1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+/* PR c/84900; casts from compound literals
+ were not considered a non-lvalue. */
+
+int main() {
+ int *p = &(int) (int) {0}; /* { dg-error "lvalue" } */
+ return 0;
+}