cp-tree.h, tree.c: New function non_cast_lvalue_p.
authorMatt Austern <austern@apple.com>
Fri, 13 Sep 2002 18:08:16 +0000 (18:08 +0000)
committerMatt Austern <austern@gcc.gnu.org>
Fri, 13 Sep 2002 18:08:16 +0000 (18:08 +0000)
2002-09-13  Matt Austern  <austern@apple.com>
        * 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

gcc/ChangeLog
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/tree.c
gcc/testsuite/g++.dg/other/constref1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/constref2.C [new file with mode: 0644]

index 5a8c3c5215aca35afa0b8ba21a7bf08239f1c5f9..3b620b78537501331cdcb82d30f4a3f19145b18f 100644 (file)
@@ -1,3 +1,11 @@
+2002-09-13  Matt Austern  <austern@apple.com>
+       * 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  <rth@redhat.com>
 
        * config/alpha/alpha.md (attr type): Add callpal.
index 0715f2f1333cae5107b0c3abe4766f9fe9346aba..b428145007b44f5277e7c6bc8f75c1f0c59d4b0a 100644 (file)
@@ -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);
index 8dd6b9c6af49f7534f6634125af039e22c2cfa0c..96c615d564301f9c31902c09f6a8deaf7ef2485f 100644 (file)
@@ -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,
                                                         ...));
index b0bd4fea4883be84faecade27d16d224c92e6069..4fb4e49498ddee57668a1c85fa9f536c77118758 100644 (file)
@@ -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 (file)
index 0000000..900a07d
--- /dev/null
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com>
+
+// 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 (file)
index 0000000..5c82e2d
--- /dev/null
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com>
+
+// Make sure that we can pass a cast-expression as an argument that's
+// passed to a function template by const reference.
+
+template <class T>
+void bar (const T&)
+{ }
+
+void foo (int x)
+{
+  bar ((long) x);
+}