From: Matt Austern Date: Fri, 13 Sep 2002 18:08:16 +0000 (+0000) Subject: cp-tree.h, tree.c: New function non_cast_lvalue_p. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6c6e776d78091abbf41d27cf42cdac5cd5693fff;p=gcc.git cp-tree.h, tree.c: New function non_cast_lvalue_p. 2002-09-13 Matt Austern * cp/cp-tree.h, cp/tree.c: New function non_cast_lvalue_p. * cp/call.c: Change call-by-const-reference mechanism to use non_cast_lvalue_p when deciding whether the create a temporary. We need a temporary when passing, e.g. (long) x by const ref. * testsuite/g++.dg/other/constref[12].C: New, regression tests for passing a cast expression to a function by const reference. From-SVN: r57115 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a8c3c5215a..3b620b78537 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-09-13 Matt Austern + * cp/cp-tree.h, cp/tree.c: New function non_cast_lvalue_p. + * cp/call.c: Change call-by-const-reference mechanism to use + non_cast_lvalue_p when deciding whether the create a temporary. + We need a temporary when passing, e.g. (long) x by const ref. + * testsuite/g++.dg/other/constref[12].C: New, regression tests for + passing a cast expression to a function by const reference. + 2002-09-13 Richard Henderson * config/alpha/alpha.md (attr type): Add callpal. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 0715f2f1333..b428145007b 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4059,7 +4059,7 @@ convert_like_real (convs, expr, fn, argnum, inner) tree ref_type = totype; /* If necessary, create a temporary. */ - if (NEED_TEMPORARY_P (convs) || !lvalue_p (expr)) + if (NEED_TEMPORARY_P (convs) || !non_cast_lvalue_p (expr)) { tree type = TREE_TYPE (TREE_OPERAND (convs, 0)); expr = build_target_expr_with_type (expr, type); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 8dd6b9c6af4..96c615d5643 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4184,6 +4184,7 @@ extern tree canonical_type_variant PARAMS ((tree)); extern void unshare_base_binfos PARAMS ((tree)); extern int member_p PARAMS ((tree)); extern cp_lvalue_kind real_lvalue_p PARAMS ((tree)); +extern int non_cast_lvalue_p PARAMS ((tree)); extern int non_cast_lvalue_or_else PARAMS ((tree, const char *)); extern tree build_min PARAMS ((enum tree_code, tree, ...)); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index b0bd4fea488..4fb4e49498d 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -229,6 +229,14 @@ lvalue_p (ref) (lvalue_p_1 (ref, /*class rvalue ok*/ 1, /*cast*/ 1) != clk_none); } +int +non_cast_lvalue_p (ref) + tree ref; +{ + return + (lvalue_p_1 (ref, /*class rvalue ok*/ 1, /*cast*/ 0) != clk_none); +} + /* Return nonzero if REF is an lvalue valid for this language; otherwise, print an error message and return zero. */ diff --git a/gcc/testsuite/g++.dg/other/constref1.C b/gcc/testsuite/g++.dg/other/constref1.C new file mode 100644 index 00000000000..900a07de39c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/constref1.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Matt Austern 12 Sep 2002 + +// Make sure that we can pass a cast-expression as an argument that's +// passed by const reference. + +void bar (const long&) +{ } + +void foo (int x) +{ + bar ((long) x); +} + diff --git a/gcc/testsuite/g++.dg/other/constref2.C b/gcc/testsuite/g++.dg/other/constref2.C new file mode 100644 index 00000000000..5c82e2dbbdb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/constref2.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Matt Austern 12 Sep 2002 + +// Make sure that we can pass a cast-expression as an argument that's +// passed to a function template by const reference. + +template +void bar (const T&) +{ } + +void foo (int x) +{ + bar ((long) x); +}