This reverts commit d4fe9aba3fc6f4b9cc97b100e86ffe7af5c29619. I was confused by the fact that string literals aren't writable. Nevertheless the type isn't const. As extension in GCC it's const with -Wwrite-string, which is exactly what we had before. GCC also wonders in a comment if it's really a good idea to change expression types based on warning flags (IMHO it's not), but let's be compatible. So restore the state from before.
Unified · Split
| @@ -2829,8 +2829,7 @@ static void gen_assign_cast(CType *dt) · 2828 unmodified lines | ||
| 2829 | 2829 | } |
| 2830 | 2830 | } |
| 2831 | 2831 | /* check const and volatile */ |
| 2832 | − if ((!(type1->t & VT_CONSTANT) && (type2->t & VT_CONSTANT) && | |
| 2833 | − ((type2->t & VT_BTYPE) != VT_BYTE || tcc_state->warn_write_strings)) || | |
| 2832 | + if ((!(type1->t & VT_CONSTANT) && (type2->t & VT_CONSTANT)) || | |
| 2834 | 2833 | (!(type1->t & VT_VOLATILE) && (type2->t & VT_VOLATILE))) |
| 2835 | 2834 | tcc_warning("assignment discards qualifiers from pointer target type"); |
| 2836 | 2835 | break; |
| @@ -4382,7 +4381,8 @@ ST_FUNC void unary(void) · 1545 unmodified lines | ||
| 4382 | 4381 | /* string parsing */ |
| 4383 | 4382 | t = VT_BYTE; |
| 4384 | 4383 | str_init: |
| 4385 | − t |= VT_CONSTANT; | |
| 4384 | + if (tcc_state->warn_write_strings) | |
| 4385 | + t |= VT_CONSTANT; | |
| 4386 | 4386 | type.t = t; |
| 4387 | 4387 | mk_pointer(&type); |
| 4388 | 4388 | type.t |= VT_ARRAY; |