// 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 "" }
	// { dg-warning "statement will never be executed" "" { target *-*-* } .-1 }
        status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("red")); // { dg-error "" }
        status_label.set_text("Out of memory");
    }
}
