Am Dienstag, dem 01.09.2026 um 15:11 +0000 schrieb Joseph Myers:
> On Tue, 1 Sep 2026, Martin Uecker wrote:
> 
> >     c: split -Wwrite-strings into a proper warning and a flag [PR61579]
> >     
> >     This adds a new flag -fconst-string-literals that toggles whether
> >     string literals are const-qualified or not.  The warning -Wwrite-strings
> >     is reimplemented as warning that warns whenever a string literal is
> >     implicitely converted to a pointer to a non-const-qualified character
> >     type independently on whether the string literal is actually const
> >     qualified or not.  For C++ and with -fconst-string-literals also C,
> >     the warning is activated by default.
> 
> I think -Wwrite-strings has been around for so long with its current 
> semantics that it should be considered a semantic option that changes the 
> type of string literals, despite its -W name; anything that does not 
> change the type should be named differently.  (This does not prevent 
> giving more precise diagnostics with -Wwrite-strings in the specific case 
> of string literals, as long as they are consistent with still having 
> const-qualified types - for example, as long as they remain pedwarns and 
> typeof produces the const-qualified types.)

How about doing it the other way around: Instead of
-fconst-string-literals turning on -Wwrite-strings we
have -Wwrite-strings turn on -fconst-string-literals?  Then the
behavior with just -Wwrite-strings remains the same as it always
was, but one can independently toggle it using
-fconst-string-literals (which then overwrites the default)? 

Or do you prefer a new warning option?


> 
> > +/* Test whether EXPR is a string literal.  */
> > +
> > +static bool
> > +string_literal_p (tree expr)
> 
> I suppose it's hard to get a c_expr, or information obtained from a 
> c_expr, in the places where this information is needed?  Since checking 
> original_code against STRING_CST would seem cleaner than trying to 
> reconstruct the information later.

I was thinking the same.  It is on my TODO list to see whether
the use of c_expr can be extended more, but so far it seems it
would be a much larger change.

Martin

> 
> > +    expr = TREE_OPERAND(expr, 0);
> 
> Missing space before '('.
> 
> > @@ -8841,6 +8892,7 @@ convert_for_assignment (location_t location, 
> > location_t expr_loc, tree type,
> >        /* Opaque pointers are treated like void pointers.  */
> >        is_opaque_pointer = vector_targets_convertible_p (ttl, ttr);
> >  
> > +
> >        /* The Plan 9 compiler permits a pointer to a struct to be
> >      automatically converted into a pointer to an anonymous field
> >      within the struct.  */
> 
> Why the extra blank line?
> 
> > @@ -9038,7 +9090,7 @@ convert_for_assignment (location_t location, 
> > location_t expr_loc, tree type,
> >      and vice versa; otherwise, targets must be the same.
> >      Meanwhile, the lhs target must have all the qualifiers of the rhs.  */
> >        if ((VOID_TYPE_P (ttl) && !TYPE_ATOMIC (ttl))
> > -     || (VOID_TYPE_P (ttr) && !TYPE_ATOMIC (ttr))
> > +     || (VOID_TYPE_P (ttr) && !TYPE_ATOMIC (ttr)) // FIXME
> 
> A FIXME isn't helpful without saying what's wrong that needs to be fixed.

-- 
Univ.-Prof. Dr. rer. nat. Martin Uecker
Graz University of Technology
Institute of Biomedical Imaging

Reply via email to