C: Drop qualifiers during lvalue conversion [PR97702]
authorMartin Uecker <muecker@gwdg.de>
Fri, 20 Nov 2020 06:21:40 +0000 (07:21 +0100)
committerMartin Uecker <muecker@gwdg.de>
Fri, 20 Nov 2020 06:34:11 +0000 (07:34 +0100)
2020-11-20  Martin Uecker  <muecker@gwdg.de>

gcc/
* gimplify.c (gimplify_modify_expr_rhs): Optimizie
NOP_EXPRs that contain compound literals.

gcc/c/
* c-typeck.c (convert_lvalue_to_rvalue): Drop qualifiers.

gcc/testsuite/
* gcc.dg/cond-constqual-1.c: Adapt test.
* gcc.dg/lvalue-11.c: New test.
* gcc.dg/pr60195.c: Add warning.

gcc/c/c-typeck.c
gcc/gimplify.c
gcc/testsuite/gcc.dg/cond-constqual-1.c
gcc/testsuite/gcc.dg/lvalue-11.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr60195.c

index 413109c916c3554a4e86440d108e6ad1c4dd4116..286f3d9cd6c6b2964d6c1d65a022b84dfb409c94 100644 (file)
@@ -2080,6 +2080,9 @@ convert_lvalue_to_rvalue (location_t loc, struct c_expr exp,
     exp = default_function_array_conversion (loc, exp);
   if (!VOID_TYPE_P (TREE_TYPE (exp.value)))
     exp.value = require_complete_type (loc, exp.value);
+  if (convert_p && !error_operand_p (exp.value)
+      && (TREE_CODE (TREE_TYPE (exp.value)) != ARRAY_TYPE))
+    exp.value = convert (build_qualified_type (TREE_TYPE (exp.value), TYPE_UNQUALIFIED), exp.value);
   if (really_atomic_lvalue (exp.value))
     {
       vec<tree, va_gc> *params;
index 2566ec7f0af8dc844901ad0bda2a73fdb4383b4d..fd0b5202b45227d84b18067ad476424891a800f5 100644 (file)
@@ -5518,6 +5518,19 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
            return GS_OK;
          }
 
+       case NOP_EXPR:
+         /* Pull out compound literal expressions from a NOP_EXPR.
+            Those are created in the C FE to drop qualifiers during
+            lvalue conversion.  */
+         if ((TREE_CODE (TREE_OPERAND (*from_p, 0)) == COMPOUND_LITERAL_EXPR)
+             && tree_ssa_useless_type_conversion (*from_p))
+           {
+             *from_p = TREE_OPERAND (*from_p, 0);
+             ret = GS_OK;
+             changed = true;
+           }
+         break;
+
        case COMPOUND_LITERAL_EXPR:
          {
            tree complit = TREE_OPERAND (*expr_p, 1);
index 3354c7214a47a94b9380582461c0c373b8f2541e..b5a09cb00386864255850a668f4a8991dca7fc93 100644 (file)
@@ -11,5 +11,5 @@ test (void)
   __typeof__ (1 ? foo (0) : 0) texpr;
   __typeof__ (1 ? i : 0) texpr2;
   texpr = 0;  /* { dg-bogus "read-only variable" "conditional expression with call to const function" } */
-  texpr2 = 0; /* { dg-error "read-only variable" "conditional expression with const variable" } */
+  texpr2 = 0; /* { dg-bogus "read-only variable" "conditional expression with const variable" } */
 }
diff --git a/gcc/testsuite/gcc.dg/lvalue-11.c b/gcc/testsuite/gcc.dg/lvalue-11.c
new file mode 100644 (file)
index 0000000..d8b5a60
--- /dev/null
@@ -0,0 +1,40 @@
+/* test that lvalue conversions drops qualifiers, Bug 97702 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+
+const int jc;
+extern int j;
+extern typeof(0,jc) j;
+extern typeof(+jc) j;
+extern typeof(-jc) j;
+extern typeof(1?jc:0) j;
+extern typeof((int)jc) j;
+extern typeof((const int)jc) j;
+
+volatile int kv;
+extern int k;
+extern typeof(0,kv) k;
+extern typeof(+kv) k;
+extern typeof(-kv) k;
+extern typeof(1?kv:0) k;
+extern typeof((int)kv) k;
+extern typeof((volatile int)kv) k;
+
+_Atomic int la;
+extern int l;
+extern typeof(0,la) l;
+extern typeof(+la) l;
+extern typeof(-la) l;
+extern typeof(1?la:0) l;
+extern typeof((int)la) l;
+extern typeof((_Atomic int)la) l;
+
+int * restrict mr;
+extern int *m;
+extern typeof(0,mr) m;
+extern typeof(1?mr:0) m;
+extern typeof((int *)mr) m;
+extern typeof((int * restrict)mr) m;
+
+
index 0a50a30be25456ab0c72ac5220708de93d4c96ef..8eccf7f63ad755e8f897b3cea80d8d39d2416218 100644 (file)
@@ -15,7 +15,7 @@ atomic_int
 fn2 (void)
 {
   atomic_int y = 0;
-  y;
+  y;           /* { dg-warning "statement with no effect" } */
   return y;
 }