https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48885

vries at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jsm28 at gcc dot gnu.org

--- Comment #18 from vries at gcc dot gnu.org ---
Let's rewrite the example from comment 14 to plain C (as we did in PR67705):

void
f (int *__restrict__ *__restrict__ fpp, int *fp2)
{
  int *fp = *fpp;
  *fp = 1;
  *fp2 = 2;
}

void
g (int *__restrict__ gp)
{
  f (&gp, gp);
}

void
h (void)
{
  int ha;
  g (&ha);
}

My interpretation of the restricts in the example (given what I've learned in
PR67705):

Restrict declaration D: "int *__restrict__ gp"
Type T: int
Object P: gp
Block B: g function block
Lvalues: *fp and *fp2
Objects designated by lvalues: ha in both cases.
Object ha modified during execution of B: yes
Object gp considered modified during execution of B: yes
&Lvalues: pointer expressions fp and fp2
&Lvalues based on object P: yes
Conclusion: Valid example.  Since both lvalues have their address based on
            the same restrict pointer, there are no disambiguation
            consequences.

Restrict declaration D: "int *__restrict__ *__restrict__ fpp"
Type T: int *__restrict__
Object P: fpp
Block B: f function block
Lvalues: *fpp
Objects designated by lvalues: gp
Object gp modified during execution of B: considered modified, yes
Object fpp considered modified during execution of B: yes
&Lvalues: pointer expression fpp
&Lvalues based on object P: yes
Conclusion: Valid example. Since there's only one lvalue accessing gp there
            are no disambiguation consequences.

Joseph, can you confirm that:
- this is a valid example, and
- there are no disambiguation consequences.

If that is indeed the case, then the committed patch is invalid.

Reply via email to