re PR c++/12726 (ICE (segfault) on trivial code)
authorJason Merrill <jason@redhat.com>
Thu, 23 Oct 2003 06:41:31 +0000 (02:41 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 23 Oct 2003 06:41:31 +0000 (02:41 -0400)
        PR c++/12726
        * tree.c (build_target_expr_with_type): Don't call force_rvalue
        for CONSTRUCTORs.

From-SVN: r72837

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/g++.dg/ext/complit2.C [new file with mode: 0644]

index 5096f74d4f1a30fd6f1f861e598fb5c02c6c0962..2ce7c036abc76acaa2a2ba29bac1747939570379 100644 (file)
@@ -1,3 +1,9 @@
+2003-10-23  Jason Merrill  <jason@redhat.com>
+
+       PR c++/12726
+       * tree.c (build_target_expr_with_type): Don't call force_rvalue
+       for CONSTRUCTORs.
+
 2003-10-22  Kazu Hirata  <kazu@cs.umass.edu>
 
        * call.c: Fix comment formatting.
index bfcf741563be7e341ce78ecfe0b187030d973447..63fdb948c7f1ea2f226ca39f5e44bdc9a3e34f4a 100644 (file)
@@ -311,10 +311,12 @@ build_target_expr_with_type (tree init, tree type)
   if (TREE_CODE (init) == TARGET_EXPR)
     return init;
   else if (CLASS_TYPE_P (type) && !TYPE_HAS_TRIVIAL_INIT_REF (type)
-          && TREE_CODE (init) != COND_EXPR)
+          && TREE_CODE (init) != COND_EXPR
+          && TREE_CODE (init) != CONSTRUCTOR)
     /* We need to build up a copy constructor call.  COND_EXPR is a special
        case because we already have copies on the arms and we don't want
-       another one here.  */
+       another one here.  A CONSTRUCTOR is aggregate initialization, which
+       is handled separately.  */
     return force_rvalue (init);
 
   slot = build_decl (VAR_DECL, NULL_TREE, type);
diff --git a/gcc/testsuite/g++.dg/ext/complit2.C b/gcc/testsuite/g++.dg/ext/complit2.C
new file mode 100644 (file)
index 0000000..a8fe874
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/12726
+// { dg-options "" }
+
+#include <string>
+struct foobar {
+  std::string s;
+};
+int main(int argc, char **argv)
+{
+  foobar fb;
+
+  fb = (foobar) { "abcd" };
+
+  return 0;
+}