------- Additional Comments From rth at gcc dot gnu dot org  2005-01-09 04:46 
-------
Actually, I have a standards question here.

Assume for the purposes of discussion here that a source-level reference 
variable
"X" is represented as a pointer variable "x" in the intermediate language.  E.g.

      int &A, &B, C; C = A + B;
lowers to
      int *a, *b, C; C = *a + *b;

It appears that [expr.cond]/3 *does* preserve references.  Thus it would
seem that the front end should lower

      int &A, &B, &C; C = (A < B ? A : B);
to
      int *a, *b, C; c = (*a < *b ? a : b);
and not
      int *a, *b, *c; c = &(*a < *b ? *a : *b);

Note that comment #1 indicates that we're emitting the later.

If we'd actually written (*a < *b ? *a : *b) at the source level in C, it 
would be illegal for us to take the address of the result, and so the 
transformation to MAX_EXPR would be legitimate.

But I'm not sure what the actual rules for expressions for which references
are legitimate in C++.  If it's legitimate to write

      int A, &B, &C; C = (A < B ? A : B);
->
      int A, *b, *c; c = &(A < *b ? A : *b);

then I think perhaps a more accurate representation would be

      int A, *b, *c, *t; c = &*((A < *b ? t = &A : t = &*b), t);

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mmitchel at gcc dot gnu dot
                   |                            |org


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

Reply via email to