https://gcc.gnu.org/g:cda7145fa9e97f9f710a09339ea001fccb2662a2

commit r16-1266-gcda7145fa9e97f9f710a09339ea001fccb2662a2
Author: David Malcolm <dmalc...@redhat.com>
Date:   Fri Jun 6 13:41:27 2025 -0400

    text-art: allow wrapper_widget to have no child
    
    During prototyping a feature I found it useful for
    text_art::wrapper_widget to be able to not have a child.
    
    gcc/ChangeLog:
            * text-art/widget.cc (selftest::test_empty_wrapper_widget): New.
            (selftest::text_art_widget_cc_tests): Call it.
            * text-art/widget.h (text_art::wrapper_widget::calc_req_size):
            Gracefully handle m_child being null.
            (text_art::wrapper_widget::update_child_alloc_rects): Likewise.
            (text_art::wrapper_widget::paint_to_canvas): Likewise.
    
    Signed-off-by: David Malcolm <dmalc...@redhat.com>

Diff:
---
 gcc/text-art/widget.cc | 10 ++++++++++
 gcc/text-art/widget.h  | 11 ++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/gcc/text-art/widget.cc b/gcc/text-art/widget.cc
index 3c68018c3b54..5d3e5178484c 100644
--- a/gcc/text-art/widget.cc
+++ b/gcc/text-art/widget.cc
@@ -199,6 +199,15 @@ test_wrapper_widget ()
       "BBB\n"));
 }
 
+static void
+test_empty_wrapper_widget ()
+{
+  style_manager sm;
+  wrapper_widget w (nullptr);
+  canvas c (w.to_canvas (sm));
+  ASSERT_CANVAS_STREQ (c, false, "");
+}
+
 static void
 test_vbox_1 ()
 {
@@ -263,6 +272,7 @@ text_art_widget_cc_tests ()
   test_test_widget ();
   test_text_widget ();
   test_wrapper_widget ();
+  test_empty_wrapper_widget ();
   test_vbox_1 ();
   test_vbox_2 ();
   test_canvas_widget ();
diff --git a/gcc/text-art/widget.h b/gcc/text-art/widget.h
index 55655ebfd62a..ab7b1d3c4ecc 100644
--- a/gcc/text-art/widget.h
+++ b/gcc/text-art/widget.h
@@ -146,15 +146,20 @@ class wrapper_widget : public widget
   }
   canvas::size_t calc_req_size () override
   {
-    return m_child->get_req_size ();
+    if (m_child)
+      return m_child->get_req_size ();
+    else
+      return canvas::size_t (0,0);
   }
   void update_child_alloc_rects () override
   {
-    m_child->set_alloc_rect (get_alloc_rect ());
+    if (m_child)
+      m_child->set_alloc_rect (get_alloc_rect ());
   }
   void paint_to_canvas (canvas &canvas) override
   {
-    m_child->paint_to_canvas (canvas);
+    if (m_child)
+      m_child->paint_to_canvas (canvas);
   }
  private:
   std::unique_ptr<widget> m_child;

Reply via email to