re PR c++/42701 (ICE on error recovery)
authorJason Merrill <jason@gcc.gnu.org>
Thu, 14 Jan 2010 22:32:24 +0000 (17:32 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 14 Jan 2010 22:32:24 +0000 (17:32 -0500)
PR c++/42701
* call.c (build_new_method_call): Don't free the vec here.

From-SVN: r155916

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/overload/error3.C [new file with mode: 0644]

index 1374a5b02de88dbad53a7fc744647baf7e712308..c6e309f6820619aac4c7016f000bc7f6de9d4bff 100644 (file)
@@ -1,5 +1,8 @@
 2010-01-14  Jason Merrill  <jason@redhat.com>
 
+       PR c++/42701
+       * call.c (build_new_method_call): Don't free the vec here.
+
        PR c++/42655
        * call.c (convert_like_real): Do full decay_conversion for ck_rvalue.
 
index 935aea865f9fe4ac79e687756549b97ed95e66cc..54254c37f1d82d33d7fb0841ad082b77af54d42f 100644 (file)
@@ -6256,11 +6256,10 @@ build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args,
       permerror (input_location,
                 "cannot call constructor %<%T::%D%> directly",
                 basetype, name);
-      inform (input_location, "for a function-style cast, remove the "
-             "redundant %<::%D%>", name);
+      permerror (input_location, "  for a function-style cast, remove the "
+                "redundant %<::%D%>", name);
       call = build_functional_cast (basetype, build_tree_list_vec (user_args),
                                    complain);
-      release_tree_vector (user_args);
       return call;
     }
 
index 7c747c39dbe26cc2a55dbea7a958b74128fa4108..7c89ccde3bdeb83610c7a64477933f96e4d1b945 100644 (file)
@@ -1,12 +1,15 @@
 2010-01-14  Jason Merrill  <jason@redhat.com>
 
+       PR c++/42701
+       * g++.dg/overload/error3.C: New.
+
        PR c++/42655
        * g++.dg/overload/rvalue1.C: New.
 
 2010-01-14  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/42706
-       * gcc.dg/ipa/pr42706.c: New testcase.   
+       * gcc.dg/ipa/pr42706.c: New testcase.
 
 2010-01-14  H.J. Lu  <hongjiu.lu@intel.com>
 
diff --git a/gcc/testsuite/g++.dg/overload/error3.C b/gcc/testsuite/g++.dg/overload/error3.C
new file mode 100644 (file)
index 0000000..e0003dd
--- /dev/null
@@ -0,0 +1,41 @@
+// PR c++/42701
+// Test for error-recovery on code that is ill-formed by DR 147.
+
+namespace Glib {
+    class ustring {
+    public:
+        typedef unsigned size_type;
+        ustring(const char* src, size_type n);
+        ustring(const char* src);
+    };
+}
+namespace Gdk {
+    class Color {
+    public:
+        explicit Color(const Glib::ustring& value);
+    };
+}
+namespace Gtk {
+    enum StateType { STATE_NORMAL };
+    class Widget   {
+    public:
+        void modify_bg(StateType state, const Gdk::Color& color);
+    };
+    class Label {
+    public:
+        void set_text(const Glib::ustring &str);
+    };
+}
+typedef enum Result { eSuccess = 0 } Result;
+class MainWindow  {
+    void update_status(Result result);
+    Gtk::Widget status_frame;
+    Gtk::Label status_label;
+};
+void MainWindow::update_status(Result result) {
+    switch (result) {
+        status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("green")); // { dg-error "" }
+        status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("red")); // { dg-error "" }
+        status_label.set_text("Out of memory");
+    }
+}