extern void v;
void f(void) { &v; }

is invalid in both C90 and C99: lvalues cannot have type void, although they can
have types const void or volatile void, and none of the other possibilities for
operands on '&' are met.  However, GCC fails to diagnose this code.

extern void *p;
void f(void) { &*p; }

is invalid in C90 (for the same reason) but valid in C99 because the result of a
'*' operator is a permitted operand for '&' in C99 even if not an lvalue.  GCC
gives a warning "dereferencing 'void *' pointer", but not an error with
-pedantic-errors.  In C90 mode, but not in C99 mode, the use of '&' in this code
should receive a pedwarn.  See also DRs 012 and 106.

I hope to fix these issues properly for 4.2 by moving information about whether
an expression has the right syntax to be an lvalue, or is the result of * or []
operators, into the c_expr structure; the difference between the above cases is
why this naturally involves two flags rather than one in that structure.  It is
however likely a simpler local fix could be found before then that examines the
trees to distinguish the two cases.

-- 
           Summary: constraints on '&' not fully implemented
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jsm28 at gcc dot gnu dot org
                CC: gcc-bugs at gcc dot gnu dot org
OtherBugsDependingO 16620,16989
             nThis:


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22367

Reply via email to