From: Jason Merrill Date: Thu, 5 May 2011 20:09:18 +0000 (-0400) Subject: cp-tree.h (REFERENCE_REF_P): Just check the type. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=31e292c7a319a9a8bc449cf8514ed45951bb706e;p=gcc.git cp-tree.h (REFERENCE_REF_P): Just check the type. * cp-tree.h (REFERENCE_REF_P): Just check the type. * cvt.c (convert_from_reference): Adjust. * pt.c (build_non_dependent_expr): Adjust. * semantics.c (finish_offsetof): Adjust. * tree.c (lvalue_kind): Use it. From-SVN: r173449 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ff3ad54d05f..20057c5bc6e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2011-05-05 Jason Merrill + * cp-tree.h (REFERENCE_REF_P): Just check the type. + * cvt.c (convert_from_reference): Adjust. + * pt.c (build_non_dependent_expr): Adjust. + * semantics.c (finish_offsetof): Adjust. + * tree.c (lvalue_kind): Use it. + PR c++/48873 * tree.c (stabilize_expr): Don't make gratuitous copies of classes. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 961581e50c2..fcb715ce7dd 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -62,7 +62,6 @@ c-common.h, not after. STMT_EXPR_NO_SCOPE (in STMT_EXPR) BIND_EXPR_TRY_BLOCK (in BIND_EXPR) TYPENAME_IS_ENUM_P (in TYPENAME_TYPE) - REFERENCE_REF_P (in INDIRECT_EXPR) QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF) OMP_FOR_GIMPLIFYING_P (in OMP_FOR) BASELINK_QUALIFIED_P (in BASELINK) @@ -2781,9 +2780,12 @@ extern void decl_shadowed_for_var_insert (tree, tree); (LANG_DECL_FN_CHECK (FUNCTION_DECL_CHECK (NODE)) \ ->u.saved_language_function) -/* Indicates an indirect_expr is for converting a reference. */ -#define REFERENCE_REF_P(NODE) \ - TREE_LANG_FLAG_0 (INDIRECT_REF_CHECK (NODE)) +/* True if NODE is an implicit INDIRECT_EXPR from convert_from_reference. */ +#define REFERENCE_REF_P(NODE) \ + (TREE_CODE (NODE) == INDIRECT_REF \ + && TREE_TYPE (TREE_OPERAND (NODE, 0)) \ + && (TREE_CODE (TREE_TYPE (TREE_OPERAND ((NODE), 0))) \ + == REFERENCE_TYPE)) #define NEW_EXPR_USE_GLOBAL(NODE) \ TREE_LANG_FLAG_0 (NEW_EXPR_CHECK (NODE)) diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 64fe87187ab..db4ea46e46a 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -520,7 +520,6 @@ convert_from_reference (tree val) 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; } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b56ab1f1abd..d109e1bd739 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -18918,7 +18918,7 @@ build_non_dependent_expr (tree expr) /* Keep dereferences outside the NON_DEPENDENT_EXPR so lvalue_kind doesn't need to look inside. */ - if (TREE_CODE (expr) == INDIRECT_REF && REFERENCE_REF_P (expr)) + if (REFERENCE_REF_P (expr)) return convert_from_reference (build_non_dependent_expr (TREE_OPERAND (expr, 0))); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 815824a5b7a..8bf5a521dd4 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3428,7 +3428,7 @@ finish_offsetof (tree expr) error ("cannot apply % to member function %qD", expr); return error_mark_node; } - if (TREE_CODE (expr) == INDIRECT_REF && REFERENCE_REF_P (expr)) + if (REFERENCE_REF_P (expr)) expr = TREE_OPERAND (expr, 0); return fold_offsetof (expr, NULL_TREE); } diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 9a6e26dcabf..32303930527 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -61,9 +61,7 @@ lvalue_kind (const_tree ref) INDIRECT_REFs. INDIRECT_REFs are just internal compiler representation, not part of the language, so we have to look through them. */ - if (TREE_CODE (ref) == INDIRECT_REF - && TREE_CODE (TREE_TYPE (TREE_OPERAND (ref, 0))) - == REFERENCE_TYPE) + if (REFERENCE_REF_P (ref)) return lvalue_kind (TREE_OPERAND (ref, 0)); if (TREE_TYPE (ref)