static void warn_ref_binding (tree reftype, tree intype, tree decl) { tree ttl = TREE_TYPE (reftype); if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl)) { const char *msg; if (CP_TYPE_VOLATILE_P (ttl) && decl) msg = "initialization of volatile reference type %q#T from" " rvalue of type %qT"; else if (CP_TYPE_VOLATILE_P (ttl)) msg = "conversion to volatile reference type %q#T " " from rvalue of type %qT"; else if (decl) msg = "initialization of non-const reference type %q#T from" " rvalue of type %qT"; else msg = "conversion to non-const reference type %q#T from" " rvalue of type %qT"; permerror (input_location, msg, reftype, intype); } }
static void warn_ref_binding (tree reftype, tree intype, tree decl) { tree ttl = TREE_TYPE (reftype); if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl)) { const char *msg; if (CP_TYPE_VOLATILE_P (ttl) && decl) msg = "initialization of volatile reference type `%#T' from rvalue of type `%T'"; else if (CP_TYPE_VOLATILE_P (ttl)) msg = "conversion to volatile reference type `%#T' from rvalue of type `%T'"; else if (decl) msg = "initialization of non-const reference type `%#T' from rvalue of type `%T'"; else msg = "conversion to non-const reference type `%#T' from rvalue of type `%T'"; pedwarn (msg, reftype, intype); } }
tree convert_from_reference (tree val) { if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE) { tree t = canonical_type_variant (TREE_TYPE (TREE_TYPE (val))); tree ref = build1 (INDIRECT_REF, t, val); /* We *must* set TREE_READONLY when dereferencing a pointer to const, so that we get the proper error message if the result is used to assign to. Also, &* is supposed to be a no-op. */ TREE_READONLY (ref) = CP_TYPE_CONST_P (t); TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t); TREE_SIDE_EFFECTS (ref) = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val)); REFERENCE_REF_P (ref) = 1; val = ref; } return val; }