From e9e1867f2fe541b5b8ca41e6832e40638d272826 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Thu, 3 Mar 2022 21:05:10 +0100
Subject: [PATCH] FIX: Need to trick the IrElement::setParent to not
 dereference a nullptr in some cases...

---
 src/Lib/Script/Ast/IrElement.cc | 19 ++++++++++++++++---
 src/Lib/Script/Ast/IrElement.hh |  7 ++++---
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/Lib/Script/Ast/IrElement.cc b/src/Lib/Script/Ast/IrElement.cc
index 5dd4c025..ecb036ae 100644
--- a/src/Lib/Script/Ast/IrElement.cc
+++ b/src/Lib/Script/Ast/IrElement.cc
@@ -7,10 +7,21 @@ namespace Vivy::Script
 {
 IrElement::IrElement(IrElement *p) noexcept
 {
+    /*
+    ** Need to trick the setParent or we might dereference a nullptr... Can't
+    ** think of a cleaner way for now.
+    */
+
+    parentRootIsNotInitialized = false;
     setParent(p);
-    parentRoot = parent()->irRoot();
-    if (parentRoot == nullptr)
-        parentRoot = dynamic_cast<IrRoot *>(this);
+    parentRootIsNotInitialized = true;
+
+    if (parent() != nullptr) {
+        parentRoot                 = parent()->irRoot();
+        parentRootIsNotInitialized = false;
+        if (parentRoot == nullptr)
+            parentRoot = dynamic_cast<IrRoot *>(this);
+    }
 }
 
 IrRoot *
@@ -90,6 +101,8 @@ IrElement::setParent(IrElement *p) noexcept
     parentElement = p;
     if (parentElement != nullptr)
         parentElement->addChild(this);
+    if (parentRootIsNotInitialized)
+        parentRoot = parent()->irRoot();
 }
 
 void
diff --git a/src/Lib/Script/Ast/IrElement.hh b/src/Lib/Script/Ast/IrElement.hh
index 77d353c2..a496188d 100644
--- a/src/Lib/Script/Ast/IrElement.hh
+++ b/src/Lib/Script/Ast/IrElement.hh
@@ -106,9 +106,10 @@ concept IrElementParsable = std::is_base_of<IrElement, T>::value && requires(T i
 
 /* Base class definition: IrElement */
 class IrElement {
-    IrElement *parentElement       = nullptr;
-    IrAttribute *elementAttributes = nullptr;
-    IrRoot *parentRoot             = nullptr;
+    IrElement *parentElement        = nullptr;
+    IrAttribute *elementAttributes  = nullptr;
+    IrRoot *parentRoot              = nullptr;
+    bool parentRootIsNotInitialized = true;
     std::vector<IrElement *> childElements;
 
 protected:
-- 
GitLab