Am Donnerstag, den 12.08.2021, 16:58 +0000 schrieb Joseph Myers:
> On Mon, 24 May 2021, Uecker, Martin wrote:
> 
> > -      else if (VOID_TYPE_P (TREE_TYPE (type1))
> > -          && !TYPE_ATOMIC (TREE_TYPE (type1)))
> > -   {
> > -     if ((TREE_CODE (TREE_TYPE (type2)) == ARRAY_TYPE)
> > -         && (TYPE_QUALS (strip_array_types (TREE_TYPE (type2)))
> > -             & ~TYPE_QUALS (TREE_TYPE (type1))))
> > -       warning_at (colon_loc, OPT_Wdiscarded_array_qualifiers,
> > -                   "pointer to array loses qualifier "
> > -                   "in conditional expression");
> > -
> > -     if (TREE_CODE (TREE_TYPE (type2)) == FUNCTION_TYPE)
> > +      else if ((VOID_TYPE_P (TREE_TYPE (type1))
> > +           && !TYPE_ATOMIC (TREE_TYPE (type1)))
> > +          || (VOID_TYPE_P (TREE_TYPE (type2))
> > +              && !TYPE_ATOMIC (TREE_TYPE (type2))))
> 
> Here you're unifying the two cases where one argument is (not a null 
> pointer constant and) a pointer to qualified or unqualified void (and the 
> other argument is not a pointer to qualified or unqualified void).  The 
> !TYPE_ATOMIC checks are because of the general rule that _Atomic is a type 
> qualifier only syntactically, so _Atomic void doesn't count as qualified 
> void for this purpose.
> 
> > +   {
> > +     tree t1 = TREE_TYPE (type1);
> > +     tree t2 = TREE_TYPE (type2);
> > +     if (!VOID_TYPE_P (t1))
> > +      {
> > +        /* roles are swapped */
> > +        t1 = t2;
> > +        t2 = TREE_TYPE (type1);
> > +      }
> 
> But here you don't have a TYPE_ATOMIC check before swapping.  So if t1 is 
> _Atomic void and t2 is void, the types don't get swapped.
> 
> > +     /* for array, use qualifiers of element type */
> > +     if (flag_isoc2x)
> > +       t2 = t2_stripped;
> > +     result_type = build_pointer_type (qualify_type (t1, t2));
> 
> And then it looks to me like this will end up with _Atomic void * as the 
> result type, when a conditional expression between _Atomic void * and 
> void * should actually have type void *.
> 
> If that's indeed the case, I think the swapping needs to occur whenever t1 
> is not *non-atomic* void, so that the condition for swapping matches the 
> condition checked in the outer if.  (And of course there should be a 
> testcase for that.)
> 
> I didn't see any other issues in this version of the patch.

Committed with this change and the additional test.

Martin

> 

Reply via email to