call.c (convert_like_real): Create a temporary for non-lvalue.
authorJakub Jelinek <jakub@redhat.com>
Fri, 16 Feb 2001 22:30:06 +0000 (23:30 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 16 Feb 2001 22:30:06 +0000 (23:30 +0100)
* call.c (convert_like_real): Create a temporary for non-lvalue.

* g++.old-deja/g++.other/init16.C: Update the test so that it does
not need <string> and also tests the initialization at runtime.

From-SVN: r39776

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/init16.C

index 6341bbedfb4a9b8a10a03c35502f8673cd0af163..d79146c010acd9cba7550542b7a0626d710fcd2d 100644 (file)
@@ -1,3 +1,7 @@
+2001-02-16  Jakub Jelinek  <jakub@redhat.com>
+
+       * call.c (convert_like_real): Create a temporary for non-lvalue.
+
 2001-02-16  Jeffrey Oldham  <oldham@codesourcery.com>
 
        * cp-tree.h: Fix typos in comments.
index 11cb6404054246b705b1bbb2b2d03868617db2b8..7e2124fe8d094026ef095c3ad81b7739d61a108f 100644 (file)
@@ -3850,7 +3850,7 @@ convert_like_real (convs, expr, fn, argnum, inner)
        tree ref_type = totype;
 
        /* If necessary, create a temporary.  */
-       if (NEED_TEMPORARY_P (convs))
+       if (NEED_TEMPORARY_P (convs) || !lvalue_p (expr))
          {
            tree type = TREE_TYPE (TREE_OPERAND (convs, 0));
            expr = build_target_expr_with_type (expr, type);
index 09576beec2ff30ce818234eb3cd0f6ef6be58f62..3d93933e54a602cc9504da9a40e8aedb7ad471cf 100644 (file)
@@ -1,3 +1,8 @@
+2001-02-16  Jakub Jelinek  <jakub@redhat.com>
+
+       * g++.old-deja/g++.other/init16.C: Update the test so that it does
+       not need <string> and also tests the initialization at runtime.
+
 2001-02-16  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * gcc.c-torture/execute/longlong.c: New test.
index 8d7c1af3b102f4d0472b2cc0f37e0d790901cde2..83d5a4eb5c5399d44b4fe804aa043e41e67919b6 100644 (file)
@@ -1,11 +1,28 @@
-// Build don't link:
 // Origin: Jakub Jelinek <jakub@redhat.com>
 
-// excess errors test - XFAIL *-*-*
-
-#include <string>
+struct bar {
+  char c;
+  bar (const char *);
+  bar (const bar &);
+};
 
 struct foo {
-  string x;
+  bar x;
 };
+
 extern const struct foo y = { "foo" };
+
+bar::bar (const bar &ref)
+{
+  c = ref.c;
+}
+
+bar::bar (const char *p)
+{
+  c = p[2];
+}
+
+int main ()
+{
+  return y.x.c != 'o';
+}