[Bug c++/50025] [DR 1288] C++0x initialization syntax doesn't work for class members of reference type
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Jan 19 20:42:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50025
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jason at gcc dot gnu.org
--- Comment #12 from Jonathan Wakely <redi at gcc dot gnu.org> 2013-01-19 20:42:14 UTC ---
Jason, I'd like to try and fix this, but need some clues.
A minimal example that fails to compile is:
struct S { } s;
S& r{s};
I find that in call.c:reference_binding we get compatible_p = false, which
seems to be wrong. Even if compatible_p is true we don't take the branch that
looks like it should be used:
/* Directly bind reference when target expression's type is compatible with
the reference and expression is an lvalue. In DR391, the wording in
[8.5.3/5 dcl.init.ref] is changed to also require direct bindings for
const and rvalue references to rvalues of compatible class type.
We should also do direct bindings for non-class xvalues. */
if (compatible_p
&& (is_lvalue
|| (((CP_TYPE_CONST_NON_VOLATILE_P (to)
&& !(flags & LOOKUP_NO_RVAL_BIND))
|| TYPE_REF_IS_RVALUE (rto))
&& (gl_kind
|| (!(flags & LOOKUP_NO_TEMP_BIND)
&& (CLASS_TYPE_P (from)
|| TREE_CODE (from) == ARRAY_TYPE))))))
Naively I would expect compatible_p and is_lvalue to be true for the case
above. Does the code earlier in the function need to be adjusted for the case
where a braced-init-list has a single element of reference-compatible lvalue
type?
More information about the Gcc-bugs
mailing list